javascript
Springbooot集成Shiro简单使用
文章目錄
- 1.Shiro架構
- 2.Shiro環境搭建
- 3.Shiro用戶登錄攔截與認證
1.Shiro架構
Shiro三個主要的概念:
Shiro外部架構
- Subject:主體,當前參與應用安全部分的主體??梢允怯脩?#xff0c;可以是第三方服務,可以是cron 任務,或者任何東西。主要指一個正在與當前軟件交互的東西。所有Subject都需要SecurityManager,當與Subject進行交互,這些交互行為實際上被轉換為與SecurityManager的交互
- SecurityManager:安全管理員,Shiro架構的核心,它就像Shiro內部所有原件的保護傘。然而一旦配置了SecurityManager,SecurityManager就用到的比較少,開發者大部分時間都花在Subject上面。當你與Subject進行交互的時候,實際上是SecurityManager在背后幫你舉起Subject來做一些安全操作。
- Realms:Realms作為Shiro和應用的連接橋,當需要與安全數據交互的時候,像用戶賬戶,或者訪問控制,Shiro就從一個或多個Realms中查找。Shiro提供了一些可以直接使用的Realms,如果默認的Realms不能滿足你的需求,你也可以定制自己的Realms
Shiro整體架構
Authenticator:認證器,管理登陸與登出。
Authorizer:授權器,賦予主體權限。
Session Manager:session管理器,session管理機制。不借助任何web容器使用session
Session Dao:session操作,主要增刪改查。
Cache Manager:緩存管理器
Pluggable Realms(1 or more):shiro與數據庫的連接,認證授權校驗
Cryptography:數據加密
Shiro核心組件
-
Subject 即主體,外部引用于 Subject 進行交互,Subject 記錄了當前操作用戶,將用戶的概念理解為當前操作的主體,可能是一個通過瀏覽器請求的用戶,也可能是一個運行的程序。Subject 在 Shrio 中是一個接口,接口中定義了很多認證授權相關的方法,外部程序通過 Sbject 進行認證授權,而 Sbject 是通過 SecurityManager 安全管理器進行認證授權的。
-
SecurityManager 即安全管理器,對全部的 Sbject 進行安全管理,它是 Shrio 的核心,通過 SecurityManager 可以完成全部 Sbject 的認證、授權等。實質上 SecurityManager 是通過 Authenticator 進行認證,通過 Authorizer 進行授權,通過 SessionManager 進行會話管理等。SecurityManager是一個接口,繼承了 Authenticator ,Authorizer ,SessionManager 這三個接口。
-
Authenticator即認證器,對用戶身份進行認證,Authenticator 是一個接口,Shrio 提供了 ModularRealmAuthenticator實現類,通過ModularRealmAuthenticator 基本上可以滿足大多數需求,也可以自定義認證器。
Authorizer即授權器,用戶通過認證器認證通過,在訪問功能時需要通過授權器判斷用戶是否有此功能的操作權限。 -
Realm即領域,相當于 datasource 數據源,SecurityManager 進行安全認證需要通過 Realm 獲取用戶權限數據,比如:如果用戶身份數據在數據庫,那么 Realm 就需要從數據庫獲取用戶身份信息。不要把 Realm 理解成只是從數據源取數據,在 Realm 中還有認證授權校驗的相關代碼。
-
SessionManager 即會話管理,Shrio 框架定義了一套會話管理,它不依賴 web 容器的 Session ,所以Shrio 可以使用在非 Web 應用上,也可以將分布式應用的會話集中在一點管理,此特性可使它實現單點登錄。
-
SessionDAO 即會話DAO,是對 Session 會話操作的一套接口,比如要將 Session 存儲到數據庫,可以通過 jdbc 將會話存儲到數據庫。
-
CacheManager 即緩存管理,將用戶權限數據存儲在緩存,這樣可以提高性能。
-
Cryptografy即密碼管理,Shrio 提供了一套解密/加密的組件,方便開發。比如提供常用的散列、加/解密功能。
2.Shiro環境搭建
主要分三步
1.導入maven
<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.6.0</version></dependency>2.編寫Realm
public class UserRealm extends AuthorizingRealm {//授權@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {return null;}//認證@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {return null;} }3.編寫ShiroConfig
@Configuration public class ShiroConfig {//ShiroFilterFactoryBean 3@Beanpublic ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();//設置安全管理器bean.setSecurityManager(defaultWebSecurityManager);return bean;}//DefaultWebSecurityManager 2@Beanpublic DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(userRealm);return securityManager;}//創建realm對象 1@Bean(name = "userRealm")public UserRealm userRealm(){return new UserRealm();} }3.Shiro用戶登錄攔截與認證
shiro的內置過濾器各個權限
- anno:無需認證就可以訪問
- authc:必須認證了才能訪問
- user:必須擁有記住我功能才能訪問
- perms:必須擁有對某個資源的權限才能訪問
- role:擁有某個角色權限才能訪問
在getShiroFilterFactoryBean中添加內置過濾器實現登錄攔截
bean.setLoginUrl("/user/toLogin"); 可以設置攔截時的重定向
在UserRealm 下的 doGetAuthenticationInfo方法中 添加用戶執行認證
@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {System.out.println("執行了認證");String username = "root";String password = "123456";UsernamePasswordToken userToken = (UsernamePasswordToken) authenticationToken;if (!userToken.getUsername().equals(username)){return null; //拋出異常,UnknownAccountException}//密碼認證,shiro自己做return new SimpleAuthenticationInfo("",password,"");}在controller中獲取用戶,封裝用戶登錄的數據和登錄認證
@PostMapping("/login")public String login(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";}}總結
以上是生活随笔為你收集整理的Springbooot集成Shiro简单使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Security实现登录权
- 下一篇: JVM面试速记