SpringBoot整合Shiro 二:Shiro配置類


 

環境搭建見上篇:SpringBoot整合Shiro 一:搭建環境

 

Shiro配置類配置

shiro的配置主要集中在 ShiroFilterFactoryBean

   

  關於權限:

  anon:無需認證就可以訪問

​  authc:必須認證了才能訪問

  user:必須用有了 記住我 功能才能用

  perms:擁有對某個資源的權限才能訪問

  role:擁有某個角色權限才能訪問

 

1、登錄攔截

ShiroConfigShiroFilterFactoryBean

  給控制器添加2個 "必須認證了才能訪問"

   也就是使用 authc

@Bean(name = "shiroFilterFactoryBean")
 public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager")DefaultWebSecurityManager defaultWebSecurityManager){
     ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
     bean.setSecurityManager(defaultWebSecurityManager);
 ​
     /*
      * anon:無需認證就可以訪問
      * authc:必須認證了才能訪問
      * user:必須用有了 記住我 功能才能用
      * perms:擁有對某個資源的權限才能訪問
      * role:擁有某個角色權限才能訪問
      */
     Map<String ,String> filterMap = new LinkedHashMap<>();
 ​
     filterMap.put("/user/add","authc");
     filterMap.put("/user/update","authc");
 ​
     bean.setFilterChainDefinitionMap(filterMap);
 ​
     return bean;
 }

 

訪問測試

點擊 addupdate

都出現這個404頁面

 

2、添加登錄頁面

登錄頁面

login.html

<!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
 </head>
 <body><h1>登錄</h1>
 <hr><form action="">
     <p>用戶名:<input type="text" name="username"></p>
     <p>密碼:<input type="text" name="password"></p>
     <p><input type="submit"></p>
 </form></body>
 </html>

對應controller

 @RequestMapping("/toLogin")
 public String toLogin(){
     return "login";
 }

 

shiro配置類

  1.add 與 update 跳轉合並

    filterMap.put("/user/*","authc");

  2.添加一個登錄跳轉

    bean.setLoginUrl("/toLogin");

@Bean(name = "shiroFilterFactoryBean")
 public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager")DefaultWebSecurityManager defaultWebSecurityManager){
     ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
     bean.setSecurityManager(defaultWebSecurityManager);
 ​
     /*
      * anon:無需認證就可以訪問
      * authc:必須認證了才能訪問
      * user:必須用有了 記住我 功能才能用
      * perms:擁有對某個資源的權限才能訪問
      * role:擁有某個角色權限才能訪問
      */
     Map<String ,String> filterMap = new LinkedHashMap<>();
 ​
     filterMap.put("/user/*","authc");
 ​
     bean.setFilterChainDefinitionMap(filterMap);
 ​
     bean.setLoginUrl("/toLogin");
 ​
     return bean;
 }

 

測試

點擊 addupdate

出現登錄頁面

 

3、認證

controller中

  1.獲取當前的用戶

     Subject subject = SecurityUtils.getSubject();

  2.封裝用戶的登錄數據

     UsernamePasswordToken token = new UsernamePasswordToken(username, password);

  3.執行登錄方法,如果沒有異常說明OK

    subject.login(token);

  4.對應異常

    UnknownAccountException:用戶名不存在

    IncorrectCredentialsException:密碼錯誤

@RequestMapping("/login")
 public String login(String username, String password, Model model) {
 ​
     //獲取當前的用戶
     Subject subject = SecurityUtils.getSubject();
 ​
     //封裝用戶的登錄數據
     UsernamePasswordToken token = new UsernamePasswordToken(username, password);
 ​
     try {
         subject.login(token); //執行登錄方法,如果沒有異常說明OK
         return "index";
     } catch (UnknownAccountException e) {   //用戶名不存在
         model.addAttribute("msg", "用戶名錯誤");
         return "login";
     } catch (IncorrectCredentialsException e) {   //密碼錯誤
         model.addAttribute("msg", "密碼錯誤");
         return "login";
     }
 ​
 }

 

認證具體任務

UserRealm 中 doGetAuthenticationInfo

先將數據寫死測試

只需判斷用戶名,密碼shiro判斷

//認證
 @Override
 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
     System.out.println("執行了=>認證doGetAuthenticationInfo");
 ​
     //用戶名+密碼
     String name = "root";
     String password="123";
 ​
     UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
 ​
     if (!token.getUsername().equals(name)){
         return null;    //return null 會自動拋出異常
     }
 ​
     //密碼認證,shiro做
     return new SimpleAuthenticationInfo("",password,"");
 }

 

login.html

<!DOCTYPE html>
 <html lang="en" xmlns:th="http://www.thymeleaf.org">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
 </head>
 <body><h1>登錄</h1>
 <hr><form th:action="@{/login}">
     <p>用戶名:<input type="text" name="username"></p>
     <p>密碼:<input type="text" name="password"></p>
     <p><input type="submit"></p>
 </form><p th:text="${msg}" style="color: red"></p></body>
 </html>

 

測試

用戶名錯誤

密碼錯誤

都正確

訪問add

訪問update

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM