Shiro -- (二) 身份驗證基本流程


簡介:

在 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.總結:

 

 

流程如下:

  1. 首先調用 Subject.login(token) 進行登錄,其會自動委托給 Security Manager,調用之前必須通過 SecurityUtils.setSecurityManager() 設置;
  2. SecurityManager 負責真正的身份驗證邏輯;它會委托給 Authenticator 進行身份驗證;
  3. Authenticator 才是真正的身份驗證者,Shiro API 中核心的身份認證入口點,此處可以自定義插入自己的實現;
  4. Authenticator 可能會委托給相應的 AuthenticationStrategy 進行多 Realm 身份驗證,默認 ModularRealmAuthenticator 會調用 AuthenticationStrategy 進行多 Realm 身份驗證;
  5. Authenticator 會把相應的 token 傳入 Realm,從 Realm 獲取身份驗證信息,如果沒有返回 / 拋出異常表示身份驗證失敗了。此處可以配置多個 Realm,將按照相應的順序及策略進行訪問。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM