一、Shiro是什么?
Apache Shiro是一個Java安全權限框框架。
Shiro可以非常容易的開發出足夠好的應用,其不僅可以在javaEE環境。
Shiro可以完成,認證,授權,加密,會話管理,Web集成,緩存等。
二、Shiro工作原理
應用代碼的交互對象是 “Subject”,該對象代表了
當前 “用戶”,而所有用戶的安全操作都會交給 SecurityManager 來管理,而管理過程中會從 Realm 中獲取用戶對應的角色和權限,可以把 Realm 堪稱是安全數據源。
也就是說,我們要使用最簡單的 Shiro 應用:
- 通過 Subject 來進行認證和授權,而 Subject 又委托給了 SecurityManager 進行管理
- 我們需要給 SecurityManager 注入 Realm 以便其獲取用戶和權限進行判斷
- 也即,Shiro 不提供用戶和權限的維護,需要由開發者自行通過 Realm 注入
三、SpringBoot整合Shiro
1.xml導入jar包
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.1</version> </dependency>
2.config目錄下創建ShiroConfig.java,攔截以及授權等功能都在這里配置
@Configuration public class ShiroConfig { //1.創建realm對象 需要自定義 @Bean public UserRealm userRealm(){ return new UserRealm(); } //2.DefaultWebSecurityManager @Bean(name = "securityManager") public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); //關聯UserRealm securityManager.setRealm(userRealm); return securityManager; } //3.ShiroFilterFactoryBean @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager defaultWebSecurityManager){ ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean(); //設置安全管理器 bean.setSecurityManager(defaultWebSecurityManager); //添加shiro的內置過濾器 /** * anon:無需認證就可以訪問 * authc:必須認證了才能訪問 * user:必須擁有 記住我 功能才能用 * perms:擁有對某個資源的權限才能訪問 * role:擁有某個角色權限才能訪問 */ Map<String, String> filterMap = new LinkedHashMap<>(); //授權 filterMap.put("/user/add","perms[user:add]"); //進入需要授權(授權規則用戶后面接:add)才可以進入add filterMap.put("/user/update","perms[user:update]"); //攔截功能 filterMap.put("/user/*","authc"); //表示訪問user接口的資源都要認證 bean.setFilterChainDefinitionMap(filterMap); //******處理權限不夠或者需要授權的業務******** //如果沒有權限authc 設置登錄的請求 bean.setLoginUrl("/toLogin"); //未授權頁面 bean.setUnauthorizedUrl("/noauth"); return bean; } }
3.自定義UserRealm類,繼承AuthorizingRealm重寫用戶授權和用戶認證的方法
public class UserRealm extends AuthorizingRealm {//用戶授權 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); // info.addStringPermission("user:add"); 手動添加了權限 //拿到當前登錄的這個對象 Subject subject= SecurityUtils.getSubject(); User currentUser = (User) subject.getPrincipal(); //拿到user對象 可以設置用戶權限 //設置當前用戶的權限 從數據庫上面拿 info.addStringPermission(currentUser.getPerms()); System.out.println(currentUser.getPerms()); return info; } //用戶認證 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { UsernamePasswordToken userToken = (UsernamePasswordToken) token; //認證用戶(連接數據庫) User user = userService.queryUserByName(userToken.getUsername()); if(user==null){ return null; //UnknownAccountException } //判斷session是否有值,顯示登錄按鈕 Subject currentSubject = SecurityUtils.getSubject(); Session session = currentSubject.getSession(); session.setAttribute("loginUser",user); //可以加密:MD5 MD5鹽值加密(更高級) //密碼認證(shiro完成) return new SimpleAuthenticationInfo(user,user.getPassword(),""); } }
Shiro大致的配置就在這里了,具體功能如攔截功能、授權認證功能,可以在我的github https://github.com/ruiyeclub/SpringBoot-Hello,進行查看。
Shiro核心概述可參考文章:https://www.cnblogs.com/deng-cc/p/9401900.html