Shiro01 功能点框图、架构图、身份认证逻辑、身份认证代码实现
基本功能點
功能點框圖
功能點說明
1、Authentication:身份認證/登錄,驗證用戶是不是擁有相應的身份;
2、Authorization:授權,即權限驗證,驗證某個已認證的用戶是否擁有某個權限;即判斷用戶是否能做事情,常見的如:驗證某個用戶是否擁有某個角色。或者細粒度的驗證某個用 戶對某個資源是否具有某個權限;
3、SessionManager:會話管理,即用戶登錄后就是一次會話,在沒有退出之前,它的所有信 息都在會話中;會話可以是普通 JavaSE 環境的,也可以是如 Web 環境的;
4、Cryptography:加密,保護數據的安全性,如密碼加密存儲到數據庫,而不是明文存儲;
5、Web Support:Web 支持,可以非常容易的集成到 Web 環境;
6、Caching:緩存,比如用戶登錄后,其用戶信息、擁有的角色/權限不必每次去查,這樣可以提高效率;
7、Concurrency:shiro支持多線程應用的并發驗證,即如在一個線程中開啟另一個線程,能 把權限自動傳播過去;
8、Testing:提供測試支持;
9、Run As:允許一個用戶假裝為另一個用戶(如果他們允許)的身份進行訪問;
10、RememberMe:記住我,這個是非常常見的功能,即一次登錄后,下次再來的話不用登錄了。
11、注意:Shiro 不會去維護用戶、維護權限;這些需要我們自己去設計/提供;然后通過 相應的接口注入給 Shiro 即可。
外部架構圖
1、架構圖
2、架構說明
2.1、應用代碼直接交互的對象是Subject, 也就是說Shiro的對外API核心就是Subject;
2.2、應用代碼通過 Subject 來進行認證和授權,而 Subject 又委托給 SecurityManager;
2.3、我們需要給 Shiro 的 SecurityManager 注入 Realm,從而讓 SecurityManager 能得到合法 的用戶及其權限進行判斷。
3、API說明
3.1、Subject:主體,代表了當前“用戶”,這個用戶不一定是一個具體的人,與當前應用交互 的任何東西都是 Subject,如網絡爬蟲,機器人等;即一個抽象概念;所有 Subject 都綁定 到 SecurityManager,與 Subject 的所有交互都會委托給 SecurityManager;可以把 Subject 認 為是一個門面;SecurityManager 才是實際的執行者;
3.2、SecurityManager:安全管理器;即所有與安全有關的操作都會與 SecurityManager 交互; 且它管理著所有 Subject;可以看出它是 Shiro 的核心,它負責與后邊介紹的其他組件進行 交互,如果學習過 SpringMVC,你可以把它看成 DispatcherServlet 前端控制器;
3.3、Realm:域,Shiro 從從 Realm 獲取安全數據(如用戶、角色、權限),就是說 SecurityManager 要驗證用戶身份,那么它需要從 Realm 獲取相應的用戶進行比較以確定用戶身份是否合法;也需要從 Realm 得到用戶相應的角色/權限進行驗證用戶是否能進行操作;可以把 Realm 看 成 DataSource,即安全數據源。
4 注意:Shiro 不提供維護用戶/權限,而是通過 Realm 讓開發人員自己注入。
內部架構圖
1、架構圖
2、模塊說明
2.1、Subject:主體,可以看到主體可以是任何可以與應用交互的“用戶”;
2.2、SecurityManager : 相當于 SpringMVC 中 的 DispatcherServlet 或者 Struts2 中 的 FilterDispatcher;是 Shiro 的心臟;所有具體的交互都通過 SecurityManager 進行控制;它管 理著所有 Subject、且負責進行認證和授權、及會話、緩存的管理。
2.3、Authenticator:認證器,負責主體認證的,這是一個擴展點,如果用戶覺得 Shiro 默認的 不好,可以自定義實現;其需要認證策略(Authentication Strategy),即什么情況下算用戶 認證通過了;
2.4、Authrizer:授權器,或者訪問控制器,用來決定主體是否有權限進行相應的操作;即控制 著用戶能訪問應用中的哪些功能;
2.5、Realm:可以有1個或多個Realm,可以認為是安全實體數據源,即用于獲取安全實體的;可以是JDBC實現,也可以是LDAP實現,或者內存實現等等;由用戶提供;注意:Shiro不知道你的用戶權限存儲在哪及以何種格式存儲;所以我們一般在應用中都需要實現自己的Realm;
2.6、SessionManager:如果寫過 Servlet 就應該知道 Session 的概念,Session 呢需要有人去管理 它的生命周期,這個組件就是 SessionManager;而ShiroWeb環境,也 可以用在如普通的 JavaSE環境、EJB等環境;所有呢Shiro就抽象了一個自己的Session來管理主體與應用之間交互的數據;這樣的話,比如我們在 Web 環境用,剛開始是一臺 Web 服務器;接著又上了臺EJB服務器;這時想把兩臺服務器的會話數據放到一個地方, 這個時候就可以實現自己的分布式會話(如把數據放到 Memcached 服務器);
2.7、SessionDAO:DAO 大家都用過,數據訪問對象,用 于 會話的 CRUD,比如我們想把 Session保存到數據庫,那么可以實現自己的SessionDAO,通過如JDBC寫到數據庫;比如想把 Session 放到 Memcached中,可以實現自己的MemcachedSessionDAO;另外SessionDAO 中可以使用 Cache 進行緩存,以提高性能;
2.8、CacheManager:緩存控制器,來管理如用戶、角色、權限等的緩存的;因為這些數據基本 上很少去改變,放到緩存中后可以提高訪問的性能;
2.9、Cryptography:密碼模塊,Shiro 提高了一些常見的加密組件用于如密碼加密/解密的。
身份認證
特殊名詞
1、身份驗證:即在應用中誰能證明他就是他本人。一般提供如他們的身份 ID 一些標識信息來 表明他就是他本人,如提供身份證,用戶名/密碼來證明。 在 shiro 中,用戶需要提供 principals (身份)和 credentials(證明)給 shiro,從而應用能 驗證用戶身份:
2、principals:身份,即主體的標識屬性,可以是任何東西,如用戶名、郵箱等,唯一即可。 一個主體可以有多個 principals,但只有一個 Primary principals,一般是用戶名/密碼/手機號。
3、credentials:證明/憑證,即只有主體知道的安全值,如密碼/數字證書等。 最常見的 principals 和 credentials 組合就是用戶名/密碼了。接下來先進行一個基本的身份認 證。
4、另外兩個相關的概念是之前提到的Subject及Realm,分別是主體及驗證主體的數據源。
認證邏輯(使用IniRealm)
1、通過一個ini文件來創建Realm
2、接著獲取 SecurityManager 并將Realm綁定到SecurityManager;
3、將SecurityManager綁定到 SecurityUtils,這是一個全局設置,設置一次即可;
4、通過 SecurityUtils 得到 Subject,其會自動綁定到當前線程;如果在 web 環境在請求結 束時需要解除綁定;然后獲取身份驗證的 Token,如用戶名/密碼;
5、調用 subject.login 方法進行登錄,其會自動委托給 SecurityManager.login 方法進行登錄;
6、如果身份驗證失敗請捕獲 AuthenticationException 或 其 子類,常見的如: DisabledAccountException(禁用的帳號)、LockedAccountException(鎖定的帳號)、 UnknownAccountException(錯誤的帳號)、ExcessiveAttemptsException(登錄失敗次數過 多)、IncorrectCredentialsException(錯誤的憑證)、ExpiredCredentialsException(過期的憑證)等,具體請查看其繼承關系;對于頁面的錯誤消息展示,最好使用如“用戶名/密碼 錯誤”而不是“用戶名錯誤”/“密碼錯誤”,防止一些惡意用戶非法掃描帳號庫;
7、最后可以調用 subject.logout 退出,其會自動委托給 SecurityManager.logout 方法退出。
代碼實現
1、創建一個Maven工程,不同的maven工程即可,不需要時web工程
2、引入junit、shiro依賴
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.4.0</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency>
3、在resources目錄下創建一個shiro.ini文件
3.1、項目目錄結構
3.2、shiro.ini內容
[users] fury=111111 zeus=222222
4 測試類
package com.xunyji.shirotest.kaitao;import jdk.nashorn.internal.parser.Token; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.mgt.DefaultSecurityManager; import org.apache.shiro.realm.text.IniRealm; import org.apache.shiro.subject.Subject; import org.junit.Test;/*** @author AltEnter* @create 2019-01-17 14:58* @desc 認證**/ public class TestDemo01 {@Testpublic void testDemo01() { // 01 創建RealmIniRealm iniRealm = new IniRealm("classpath:shiro.ini"); // 02 創建SecurityManager并將Realm設置到SecurityManager中DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();defaultSecurityManager.setRealm(iniRealm);// 03 將SecurityManager設置到SecurityUtils中 SecurityUtils.setSecurityManager(defaultSecurityManager); // 04 從SecurityUtils中獲取SubjectSubject subject = SecurityUtils.getSubject(); // 05 將用戶名和用戶密碼封裝成一個TokenUsernamePasswordToken token = new UsernamePasswordToken("fury", "111111"); // 06 通過Subject進行登錄認證 subject.login(token); // 07 通過Subject判斷登錄認證結果System.out.println(String.format("用戶名fury和密碼111111的用戶的認證結果為:%s", subject.isAuthenticated()));} }
認證總結
1、認證步驟
1.1、收集用戶身份/憑證,即如用戶名/密碼;
1.2、調用 Subject.login 進行登錄,如果失敗將得到相應的 AuthenticationException 異常,根 據異常提示用戶錯誤信息;否則登錄成功;
1.3、最后調用 Subject.logout 進行退出操作。
2、改進方案
2.1、用戶名和密碼硬編碼在ini配置文件,以后需要改成如數據庫存儲,且密碼需要加密存儲;
2.2、用戶身份Token可能不僅僅是用戶名和密碼,也可能還有其他的,如登錄時允許用戶名/ 郵箱/手機號同時登錄。
3、認證流程
3.1、流程圖
認證外部流程圖:
認證內部流程圖:
3.2、首先調用 Subject.login(token)進行登錄,其會自動委托給 Security Manager,調用之前必 須通過 SecurityUtils. setSecurityManager()設置; 還需要為SecurityManager設置Realm;
3.3、SecurityManager 負責真正的身份驗證邏輯;它會委托給 Authenticator 進行身份驗證;
3.4、Authenticator才是真正的身份驗證者,ShiroAPI中核心的身份認證入口點,此處可以自 定義插入自己的實現;
3.5、Authenticator可能會委托給相應的AuthenticationStrategy進行多Realm身份驗證,默認 ModularRealmAuthenticator 會調用 AuthenticationStrategy 進行多 Realm 身份驗證;
3.6、Authenticator會把相應的token傳入Realm,從Realm獲取身份驗證信息,如果沒有返 回和拋出異常表示身份驗證失敗了。此處可以配置多個Realm,將按照相應的順序及策略進 行訪問。
4、技巧:從subject.login(token)往下查看源碼就可以清楚地知道整個登錄認證流程
轉載于:https://www.cnblogs.com/NeverCtrl-C/p/10284811.html
總結
以上是生活随笔為你收集整理的Shiro01 功能点框图、架构图、身份认证逻辑、身份认证代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面膜多少钱一张啊?
- 下一篇: Spring Cloud Alibaba