激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

云服務器|WEB服務器|FTP服務器|郵件服務器|虛擬主機|服務器安全|DNS服務器|服務器知識|Nginx|IIS|Tomcat|

服務器之家 - 服務器技術 - 服務器知識 - Apache Shiro 使用手冊(二) Shiro 認證

Apache Shiro 使用手冊(二) Shiro 認證

2021-10-15 15:37服務器技術網 服務器知識

認證就是驗證用戶身份的過程。在認證過程中,用戶需要提交實體信息(Principals)和憑據信息(Credentials)以檢驗用戶是否合法。最常見的“實體/憑證”組合便是“用戶名/密碼”組合

一、Shiro認證過程

1、收集實體/憑據信息

 

復制代碼 代碼如下:

//Example using most common scenario of username/password pair:
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
//”Remember Me” built-in:
token.setRememberMe(true);

 

UsernamePasswordToken支持最常見的用戶名/密碼的認證機制。同時,由于它實現了RememberMeAuthenticationToken接口,我們可以通過令牌設置“記住我”的功能。
但是,“已記住”和“已認證”是有區別的:
已記住的用戶僅僅是非匿名用戶,你可以通過subject.getPrincipals()獲取用戶信息。但是它并非是完全認證通過的用戶,當你訪問需要認證用戶的功能時,你仍然需要重新提交認證信息。
這一區別可以參考亞馬遜網站,網站會默認記住登錄的用戶,再次訪問網站時,對于非敏感的頁面功能,頁面上會顯示記住的用戶信息,但是當你訪問網站賬戶信息時仍然需要再次進行登錄認證。

2、提交實體/憑據信息

 

復制代碼 代碼如下:

Subject currentUser = SecurityUtils.getSubject();
currentUser.login(token);

 

收集了實體/憑據信息之后,我們可以通過SecurityUtils工具類,獲取當前的用戶,然后通過調用login方法提交認證。

3、認證處理

 

復制代碼 代碼如下:

try {
    currentUser.login(token);
} catch ( UnknownAccountException uae ) { ...
} catch ( IncorrectCredentialsException ice ) { ...
} catch ( LockedAccountException lae ) { ...
} catch ( ExcessiveAttemptsException eae ) { ...
} ... catch your own ...
} catch ( AuthenticationException ae ) {
    //unexpected error?
}

 

如果login方法執行完畢且沒有拋出任何異常信息,那么便認為用戶認證通過。之后在應用程序任意地方調用SecurityUtils.getSubject() 都可以獲取到當前認證通過的用戶實例,使用subject.isAuthenticated()判斷用戶是否已驗證都將返回true.
相反,如果login方法執行過程中拋出異常,那么將認為認證失敗。Shiro有著豐富的層次鮮明的異常類來描述認證失敗的原因,如代碼示例。

二、登出操作

登出操作可以通過調用subject.logout()來刪除你的登錄信息,如:

 

復制代碼 代碼如下:

currentUser.logout(); //removes all identifying information and invalidates their session too.

 

當執行完登出操作后,Session信息將被清空,subject將被視作為匿名用戶。

三、認證內部處理機制

以上,是Shiro認證在應用程序中的處理過程,下面將詳細解說Shiro認證的內部處理機制。

Apache Shiro 使用手冊(二) Shiro 認證



如上圖,我們通過Shiro架構圖的認證部分,來說明Shiro認證內部的處理順序:

1、應用程序構建了一個終端用戶認證信息的AuthenticationToken 實例后,調用Subject.login方法。
2、Sbuject的實例通常是DelegatingSubject類(或子類)的實例對象,在認證開始時,會委托應用程序設置的securityManager實例調用securityManager.login(token)方法。
3、SecurityManager接受到token(令牌)信息后會委托內置的Authenticator的實例(通常都是ModularRealmAuthenticator類的實例)調用authenticator.authenticate(token). ModularRealmAuthenticator在認證過程中會對設置的一個或多個Realm實例進行適配,它實際上為Shiro提供了一個可拔插的認證機制。
4、如果在應用程序中配置了多個Realm,ModularRealmAuthenticator會根據配置的AuthenticationStrategy(認證策略)來進行多Realm的認證過程。在Realm被調用后,AuthenticationStrategy將對每一個Realm的結果作出響應。
注:如果應用程序中僅配置了一個Realm,Realm將被直接調用而無需再配置認證策略。
5、判斷每一個Realm是否支持提交的token,如果支持,Realm將調用getAuthenticationInfo(token); getAuthenticationInfo 方法就是實際認證處理,我們通過覆蓋Realm的doGetAuthenticationInfo方法來編寫我們自定義的認證處理。

四、使用多個Realm的處理機制:

1、Authenticator
默認實現是ModularRealmAuthenticator,它既支持單一Realm也支持多個Realm。如果僅配置了一個Realm,ModularRealmAuthenticator 會直接調用該Realm處理認證信息,如果配置了多個Realm,它會根據認證策略來適配Realm,找到合適的Realm執行認證信息。
自定義Authenticator的配置:

 

復制代碼 代碼如下:

[main]
...
authenticator = com.foo.bar.CustomAuthenticator
securityManager.authenticator = $authenticator

 

2、AuthenticationStrategy(認證策略)

當應用程序配置了多個Realm時,ModularRealmAuthenticator將根據認證策略來判斷認證成功或是失敗。
例如,如果只有一個Realm驗證成功,而其他Realm驗證失敗,那么這次認證是否成功呢?如果大多數的Realm驗證成功了,認證是否就認為成功呢?或者,一個Realm驗證成功后,是否還需要判斷其他Realm的結果?認證策略就是根據應用程序的需要對這些問題作出決斷。
認證策略是一個無狀態的組件,在認證過程中會經過4次的調用:
在所有Realm被調用之前
在調用Realm的getAuthenticationInfo 方法之前
在調用Realm的getAuthenticationInfo 方法之后
在所有Realm被調用之后
認證策略的另外一項工作就是聚合所有Realm的結果信息封裝至一個AuthenticationInfo實例中,并將此信息返回,以此作為Subject的身份信息。
Shiro有3中認證策略的具體實現:

 

AtLeastOneSuccessfulStrategy

只要有一個(或更多)的Realm驗證成功,那么認證將被視為成功

FirstSuccessfulStrategy

第一個Realm驗證成功,整體認證將被視為成功,且后續Realm將被忽略

AllSuccessfulStrategy

所有Realm成功,認證才視為成功



ModularRealmAuthenticator 內置的認證策略默認實現是AtLeastOneSuccessfulStrategy 方式,因為這種方式也是被廣泛使用的一種認證策略。當然,你也可以通過配置文件定義你需要的策略,如:

 

 

復制代碼 代碼如下:

[main]
...
authcStrategy = org.apache.shiro.authc.pam.FirstSuccessfulStrategy
securityManager.authenticator.authenticationStrategy = $authcStrategy
...

 

3、Realm的順序

由剛才提到的認證策略,可以看到Realm在ModularRealmAuthenticator 里面的順序對認證是有影響的。
ModularRealmAuthenticator 會讀取配置在SecurityManager里的Realm。當執行認證是,它會遍歷Realm集合,對所有支持提交的token的Realm調用getAuthenticationInfo 。
因此,如果Realm的順序對你使用的認證策略結果有影響,那么你應該在配置文件中明確定義Realm的順序,如:

 

復制代碼 代碼如下:

blahRealm = com.company.blah.Realm
...
fooRealm = com.company.foo.Realm
...
barRealm = com.company.another.Realm
securityManager.realms = $fooRealm, $barRealm, $blahRealm

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产女厕一区二区三区在线视 | 久久久久国产精品久久久久 | 欧美又黄又嫩大片a级 | 国产99免费 | 激情久久一区二区 | av免费在线观看国产 | 欧美wwwsss9999| 亚洲午夜免费 | 黄色大片在线观看 | 黄色大片在线观看 | 免费黄色av | 亚洲免费视频大全 | 欧美一级黑人 | 日本黄免费 | 中文字幕在线观看1 | 李宗瑞国产福利视频一区 | 一级电影在线免费观看 | 成年免费网站 | 欧美毛片在线观看 | 国产精品视频海角社区88 | 视频一区二区中文字幕 | 亚洲精品一二三区 | 国产毛毛片一区二区三区四区 | 一区二区三区四区国产精品视频 | 他也色在线视频 | 一级黄色毛片a | 九草在线 | 免费久久精品 | 欧美乱淫 | 视频一区二区精品 | 亚洲精品 在线播放 | 韩国精品一区二区三区四区五区 | av手机免费在线观看 | 国产一区二区三区视频在线观看 | 综合精品一区 | 今井夏帆av一区二区 | 亚洲欧美在线视频免费 | 午夜爱爱福利 | 免费国产人成网站 | 日本大片在线播放 | 精品国产看高清国产毛片 |