-
authentication認證
認證(Authentication):身份驗證的過程--也就是證明一個用戶的真實身份。為了證明用戶身份,需要提供系統理解和相信的身份信息和證據。
需要通過向 Shiro 提供用戶的身份(principals)和證明(credentials )來判定是否和系統所要求的匹配。
Principals(身份) 是Subject的“標識屬性”,可以是任何與Subject相關的標識
Credentials(證明) 通常是只有 Subject 知道的機密內容,用來證明他們真正擁有所需的身份,一些簡單的證書例子如密碼、指紋、眼底掃描和X.509證書等 -
Authenticating Subjects
Subject 驗證的過程可以有效地划分分以下三個步驟:
1.收集 Subject 提交的身份和證明;
//最常用的情況是 username/password 對: UsernamePasswordToken token = new UsernamePasswordToken(username, password); //”Remember Me” 功能是內建的 token.setRememberMe(true);
2.向 Authentication 提交身份和證明;Subject currentUser = SecurityUtils.getSubject(); currentUser.login(token);
3.如果提交的內容正確,允許訪問,否則重新嘗試驗證或阻止訪問
try { currentUser.login(token); } catch ( UnknownAccountException uae ) { ... } catch ( IncorrectCredentialsException ice ) { ... } catch ( LockedAccountException lae ) { ... } catch ( ExcessiveAttemptsException eae ) { ... } ... 捕獲你自己的異常 ... } catch ( AuthenticationException ae ) { //未預計的錯誤? }
Remembered vs. Authenticated
記住的(Remembered):一個被記住的 Subject 不會是匿名的,擁有一個已知的身份(也就是說subject.getPrincipals())返回非空)。它的身份被先前的認證過程所記住,並存於先前session中,一個被認為記住的對象在執行subject.isRemembered())返回true。
已驗證(Authenticated):一個被驗證的 Subject 是成功驗證后(如登錄成功)並存於當前 session 中,一個被認為驗證過的對象調用subject.isAuthenticated()) 將返回true
remembered和authentication是互斥的Logging Out
currentUser.logout(); //清除驗證信息,使 session 失效
Authentication Sequence 認證順序
第1步:應用程序代碼調用該
Subject.login
方法,並傳入AuthenticationToken
表示最終用戶的主體和憑據的構造實例。
第2步:Subject 實例,通常是一個 DelegatingSubject(或其子類)通過調用 securityManager.login(token )將這個令牌轉交給程序的 SecurityManager。
第3步:SecurityManager,基本的“安全傘”組件,得到令牌並通過調用 authenticator.authenticate(token))簡單地將其轉交它內部的 Authenticator 實例,大部分情況下是一個 ModularRealmAuthenticator 實例,用來支持在驗證過程中協調一個或多個Realm實例。
第4步:如程序配置了多個 Realm,ModularRealmAuthenticator實例將使用其配置的 AuthenticationStrategy 開始一個 多 Realm 身份驗證的嘗試。在 Realm 被驗證調用的整個過程中,AuthenticationStrategy(安全策略)被調用用來回應每個Realm結果(如果僅有一個 Realm 被配置,它直接被調用--在單 Realm 程序中不需要AuthenticationStrategy
第5步:每一個配置的 Realm 都被檢驗看其是否支持提交的AuthenticationToken,如果支持,則該 Realm 的 getAuthenticationInfo 方法隨着提交的牌被調用,getAuthenticationInfo 方法為特定的 Realm 有效提供一次獨立的驗證嘗試
AuthenticationStrategy認證策略
AuthenticationStrategyclass | Description |
---|---|
AtLeastOneSuccessfulStrategy | 如果有一個或多個Realm驗證成功,所有的嘗試都被認為是成功的,如果沒有一個驗證成功,則該次嘗試失敗 |
FirstSuccessfulStrategy | 只有從第一個成功驗證的Realm返回的信息會被使用,以后的Realm將被忽略,如果沒有一個驗證成功,則該次嘗試失敗 |
AllSuccessfulStrategy | 所有配置的Realm在全部嘗試中都成功驗證才被認為是成功,如果有一個驗證不成功,則該次嘗試失敗。 |