簡介:
在 shiro 中,用戶需要提供 principals (身份)和 credentials(證明)給 shiro,從而應用能驗證用戶身份:
principals:身份,即主體的標識屬性,可以是任何東西,如用戶名、郵箱等,唯一即可。一個主體可以有多個 principals,但只有一個 Primary principals,一般是用戶名 / 密碼 / 手機號。
credentials:證明 / 憑證,即只有主體知道的安全值,如密碼 / 數字證書等。
最常見的 principals 和 credentials 組合就是用戶名 / 密碼了。接下來先進行一個基本的身份認證。
1.引入依賴:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.3</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.2.2</version> </dependency>
2.resources下創建shrio.ini文件,里面有兩個身份和憑據
[users]
lc=123
tt=123
3.測試類:
public class Test { @org.junit.Test public void t1(){ //獲取SecurityManager工廠,此處使用Ini配置文件初始化SecurityManager Factory<SecurityManager> factory= new IniSecurityManagerFactory("classpath:shiro.ini"); //得到SecurityManager實例 並綁定給SecurityUtils SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); //得到Subject及創建用戶名/密碼身份驗證Token(即用戶身份/憑證) Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token=new UsernamePasswordToken("lc","123"); try { //用token去登陸 subject.login(token); System.out.println(subject.isAuthenticated()+" "+subject.getPrincipals()); //身份驗證失敗異常 }catch (AuthenticationException e){ System.out.println("失敗!"); } //登出 subject.logout(); } }
運行后:驗證成功
將用戶更改為一個錯誤的username,登陸失敗,拋出驗證失敗異常
4.總結:
流程如下:
- 首先調用 Subject.login(token) 進行登錄,其會自動委托給 Security Manager,調用之前必須通過 SecurityUtils.setSecurityManager() 設置;
- SecurityManager 負責真正的身份驗證邏輯;它會委托給 Authenticator 進行身份驗證;
- Authenticator 才是真正的身份驗證者,Shiro API 中核心的身份認證入口點,此處可以自定義插入自己的實現;
- Authenticator 可能會委托給相應的 AuthenticationStrategy 進行多 Realm 身份驗證,默認 ModularRealmAuthenticator 會調用 AuthenticationStrategy 進行多 Realm 身份驗證;
- Authenticator 會把相應的 token 傳入 Realm,從 Realm 獲取身份驗證信息,如果沒有返回 / 拋出異常表示身份驗證失敗了。此處可以配置多個 Realm,將按照相應的順序及策略進行訪問。