前言
這一章我們來學習Shiro的認證。接下來看一下什麼是Shiro認證
認證
簡單說認證是覈實用戶身份的過程。也就是說,當用戶使用應用進行認證時,他們就在證明他們就是自己所說的那個人。有時這也理解爲“登錄”。它是一個典型的三步驟過程。
- 收集用戶的身份信息,稱爲當事人(principal),以及身份的支持證明,稱爲證書(Credential)。
- 將當事人和證書提交給系統。
- 如果提交的證書與系統期望的該用戶身份(當事人)匹配,該用戶就被認爲是經過認證的,反之則被認爲未經認證的。
這個過程的常見例子是大家都熟悉的“用戶 / 密碼”組合。多數用戶在登錄軟件系統時,通常提供自己的用戶名(當事人)和支持他們的密碼(證書)。如果存儲在系統中的密碼(或密碼錶示)與用戶提供的匹配,他們就被認爲通過認證。
身份認證,就是判斷一個用戶是否爲合法用戶的處理過程。最常用的簡單身份認證方式是系統通過覈對用戶輸入的用戶名和口令,看其是否與系統中存儲的該用戶的用戶名和口令一致,來判斷用戶身份是否正確。對於採用指紋等系統,則出示指紋;對於硬件Key等刷卡系統,則需要刷卡.
上圖展示了 Shiro 認證的一個重要的過程,爲了加深我們的印象,我們來自己動手來寫一個例子,來驗證一下,首先我們新建一個Maven工程,然後在pom.xml中引入相關依賴:
<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>
新建一個【AuthenticationTest】測試類:
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.SimpleAccountRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Before;
import org.junit.Test;
public class AuthenticationTest {
SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();
@Before // 在方法開始前添加一個用戶
public void addUser() {
simpleAccountRealm.addAccount("wangwu", "123456");
}
@Test
public void testAuthentication() {
//1、創建SecurityManager工廠,IniSecurityManagerFactory可以從ini文件中初始化SecurityManager環境
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
//2、,創建Security通過工廠對象Manger對象
SecurityManager securityManager = factory.getInstance();
//3、將securityManager設置到運行環境中,讓系統隨時隨地訪問securityManager
SecurityUtils.setSecurityManager(securityManager);
//4、創建當前登錄主體
Subject subject = SecurityUtils.getSubject();
//5、收集主體登錄的身份/憑證,即賬號密碼
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","666");
//6、主體登錄
subject.login(token);
//7、判斷登錄是否成功
System.out.println("驗證登錄是否成功:"+subject.isAuthenticated());
//8、登出(註銷)
subject.logout();
System.out.println("驗證登錄是否成功:"+subject.isAuthenticated());
}
}
創建ini
文件
[users]
zhangsan=666
lisi=888
運行之後可以看到預想中的效果,先輸出 第一個 驗證登錄是否成功:true 表示登錄認證成功,然後再輸出 第二個 驗證登錄是否成功:flase表示認證失敗退出登錄,再來一張圖加深一下印象:
流程如下:
- 首先調用 Subject.login(token) 進行登錄,其會自動委託給 Security Manager,調用之前必須通過 SecurityUtils.setSecurityManager() 設置;
- SecurityManager 負責真正的身份驗證邏輯;它會委託給 Authenticator 進行身份驗證;
- Authenticator 纔是真正的身份驗證者,Shiro API 中核心的身份認證入口點,此處可以自定義插入自己的實現;
- Authenticator 可能會委託給相應的 AuthenticationStrategy 進行多 Realm 身份驗證,默認 ModularRealmAuthenticator 會調用 AuthenticationStrategy 進行多 Realm 身份驗證;
- Authenticator 會把相應的 token 傳入 Realm,從 Realm 獲取身份驗證信息,如果沒有返回 / 拋出異常表示身份驗證失敗了。此處可以配置多個 Realm,將按照相應的順序及策略進行訪問。
認證常見的異常
Shiro源碼研究之登錄與登出
這裏我就不給大家細細截圖講解了,推薦一篇博客大家自行看看: