一.配置類中常用的物件和方法
1.ShiroFilterFactoryBean()物件:通過創建的該物件呼叫setSecurityManager方法去關聯DefaultWebSecurityManager物件
2.DefaultWebSecurityManager()物件:通過創建的該物件呼叫setRealm方法關聯創建的Realm物件,其中Realm物件時自己定義的一個Realm類
3.setSecurityManager()方法:通過創建ShiroFilterFactoryBean物件呼叫該方法,設定安全管理器,其引數為DefaultWebSecurityManager物件,可以從創建的ShiroFilterFactoryBean方法中傳參獲取
4.setFilterChainDefinitionMap()方法:通過創建ShiroFilterFactoryBean物件呼叫該方法,設定shiro內置的過濾器,其引數為一個map集合
5.setLoginUrl()方法:通過創建ShiroFilterFactoryBean物件呼叫該方法,設定如果沒有登錄用戶時要跳轉的頁面的地址
6.setRealm()方法:通過創建的DefaultWebSecurityManager物件呼叫該方法,設定Realm物件,其引數為Realm物件
7.代碼樣例:
package com.xiaoma.config; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.LinkedHashMap; import java.util.Map; /** * Author:xiaoma * FileName:MyShiroConfig * Data:2022/5/25 21:34 */ //這里要做三件事,創建ShiroFilterFactoryBean,創建DefaultWebSecurityManager,創建realm物件,這三件事要倒著做 @Configuration public class MyShiroConfig { //創建ShiroFilterFactoryBean,關聯DefaultWebSecurityManager @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("DWSM") DefaultWebSecurityManager defaultWebSecurityManager){ ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean(); //設定安全管理器 filterFactoryBean.setSecurityManager(defaultWebSecurityManager); /* * 添加shiro內置的過濾器 * anon:無需認證就可以訪問 * authc:必須認證才可以訪問 * user:必須擁有記住我功能才能使用 * perms:擁有對某個資源的權限才可以訪問 * role:擁有某個角色權限才可以訪問 * */ Map<String, String> filterMap = new LinkedHashMap<>(); filterMap.put("/user/add","authc"); filterMap.put("/user/update","authc"); //他需要一個map集合 filterFactoryBean.setFilterChainDefinitionMap(filterMap); //如果沒有登錄用戶,要跳轉到登錄頁 filterFactoryBean.setLoginUrl("/toLogin"); return filterFactoryBean; } //創建DefaultWebSecurityManager,通過@Qualifier注解關聯realm物件 /* * @Qualifier注解中的引數 * 如果要關聯的方法的bean沒有name屬性,那么就是該方法名,默認也是這種方式 * 如果bean注解有name屬性,那么@Qualifier注解中的引數就是bean注解的name屬性 * */ @Bean(name = "DWSM") public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(userRealm); return securityManager; } //創建realm物件,這個物件要自定義,繼承AuthorizingRealm,并重寫其中的方法 @Bean public UserRealm userRealm(){ return new UserRealm(); } }
二..Realm類中常用的物件和方法
1.UsernamePasswordToken()物件:用來設定用戶名和密碼的Token,設定是否記住我等,其常用方法有(除了構造器外)

2.SimpleAuthenticationInfo()物件:可以用來讓shiro幫我們驗證一些東西的,以驗證密碼為例,代碼如下
2.1Realm類中的代碼
package com.xiaoma.config; import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; /** * Author:xiaoma * FileName:UserRealm * Data:2022/5/25 21:34 */ public class UserRealm extends AuthorizingRealm { //授權 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { System.out.println("執行了授權"); return null; } //認證 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { System.out.println("執行了認證"); //用戶名密碼從資料庫中取出就可以了 String name="root"; String pwd="123"; UsernamePasswordToken userToken = (UsernamePasswordToken) authenticationToken; //用戶名認證 if (!userToken.getUsername().equals(name)) { //拋出例外UnknownAccountException return null; } //密碼認證shiro幫我們做 return new SimpleAuthenticationInfo("",pwd,""); } }
2.2controller介面的代碼
@RequestMapping("/login")
public String userLogin(String username,String password,Model model){
//獲取當前用戶
Subject subject = SecurityUtils.getSubject();
//封裝用戶登錄的資料
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
//執行登錄方法并捕獲相關例外
try {
//登錄成功回傳首頁
subject.login(token);
return "index";
}catch (UnknownAccountException e){
model.addAttribute("msg","用戶名錯誤");
return "login";
}catch (IncorrectCredentialsException e){
model.addAttribute("msg","密碼錯誤");
return "login";
}
}
2.3登陸界面的代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登錄</title> </head> <body> <h1>登錄</h1> <p th:text="${msg}" style="color: red"></p> <form action="/login"> <p>用戶名:<input name="username" type="text"></p> <p>密 碼:<input name="password" type="password"></p> <p><input type="submit"></p> </form> </body> </html>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/481202.html
標籤:Java
