摘要:認(rèn)證原理與認(rèn)證就是進(jìn)行身份確認(rèn)的過程,也就是用戶對應(yīng)中的需要提供證明來證實自己的身份。是的頂級抽象實現(xiàn)類,主要用于處理認(rèn)證操作,至于授權(quán)等操作則交由該類的子類去處理。至此,認(rèn)證的整體過程與底層邏輯已經(jīng)全部介紹完畢。
在上篇Shiro核心概念中,我們介紹了Shiro的三大核心概念:Subject、SecurityManager、Realms,并通過示例代碼QuickStart展示常用的認(rèn)證、鑒權(quán)、退出的操作。
本篇我們將深入到Shiro的源碼中,探究Shiro底層實現(xiàn)認(rèn)證的過程,做到“知其然知其所以然”。
1 認(rèn)證原理
1.1 Principals與Credentials
認(rèn)證就是進(jìn)行身份確認(rèn)的過程,也就是用戶(對應(yīng)Shiro中的Subject)需要提供證明來證實自己的身份。就像到自動取款機(jī)取款,持有銀行卡的人就可以理解為此處的用戶,銀行卡的取款密碼就是證明材料,如果輸入正確的密碼,就可以進(jìn)行取款。在這個過程中,有兩個概念,用戶和證明材料,對應(yīng)Shiro中的就分別是Principals與Credentials。
1.2 認(rèn)證步驟
要進(jìn)行認(rèn)證,我們需要先收集用戶的Principals與Credentials,比如用戶通過頁面上的表單提交用戶名和密碼,APP用戶通過提交手機(jī)號與短信驗證碼,然后交由服務(wù)端進(jìn)行處理。
①服務(wù)端首先收集Principals與Credentials,對應(yīng)Shiro的代碼
UsernamePasswordToken token = new UsernamePasswordToken("username", "passwd");
這里我們使用Shiro中通過的用戶名/密碼認(rèn)證方式,或者你可以實現(xiàn)AuthenticationToken接口來自定義
②接下來進(jìn)行提交,對應(yīng)代碼
Subject currentUser = SecurityUtils.getSubject(); currentUser.login(token);
③認(rèn)證結(jié)果
if (currentUser.isAuthenticated()) { // success do something } else { // fail throw exception }
1.3 認(rèn)證原理
在了解了Shiro認(rèn)證過程的基本代碼操作后,我們來看下底層是到底如何實現(xiàn)。首先我們先通過Shiro官方給出的一張認(rèn)證流程圖來作全局的了解,看看底層認(rèn)證都涉及到了哪些東西。
① 獲取Subject對象,如果還不了解如何獲取Subject對象,可以回頭去看下我們第一篇文章的介紹,或者下載示例代碼進(jìn)行了解;然后收集用戶的認(rèn)證資料,調(diào)用Subject對象的login(token)方法。
② DelegatingSubject作為Subject的實現(xiàn),本身并不負(fù)責(zé)處理認(rèn)證與授權(quán)的邏輯,而是將方法的調(diào)用傳遞給底層的SecurityManager,本質(zhì)上說,DelegatingSubject只是SecurityManager的代理類,①中login(token)方法的調(diào)用,本質(zhì)上調(diào)用調(diào)用的是SecurityManager接口的login(token)方法,而DefaultSecurityManager作為SecurityManager的默認(rèn)實現(xiàn),將調(diào)用Authenticator進(jìn)行認(rèn)證邏輯處理
③ Authenticator接口是Shiro API中的主要入口之一,就是用來負(fù)責(zé)應(yīng)用中的認(rèn)證操作的,該類作為頂級接口,只有一個authenticate(AuthenticationToken token)方法,而ModularRealmAuthenticator作為Shiro默認(rèn)的認(rèn)證處理實現(xiàn)類將會接過認(rèn)證處理的槍,通過doAuthenticate(AuthenticationToken token)來進(jìn)行認(rèn)證操作,源碼如下
Collectionrealms = getRealms(); if (realms.size() == 1) { return doSingleRealmAuthentication(realms.iterator().next(), authenticationToken); } else { return doMultiRealmAuthentication(realms, authenticationToken); }
④ 通過情況下應(yīng)用中會使用單個的Realm來進(jìn)行認(rèn)證授權(quán)處理,但是強大的Shiro卻支持配置多個Realm,在多個Realm對象存在的情況下,就需要指定認(rèn)證策略AuthenticationStrategy ,Shiro提供了三種具體的認(rèn)證策略實現(xiàn)
AtLeastOneSuccessfulStrategy:ModularRealmAuthenticator的默認(rèn)實現(xiàn),多個Realm中,如果有一個或以上認(rèn)證通過,就表示認(rèn)證成功 FirstSuccessfulStrategy:只使用第一個認(rèn)證通過的Realm返回的信息,后面的Realm將會被忽略 AllSuccessfulStrategy:所有Realm認(rèn)證通過才算認(rèn)證成功,否則認(rèn)證失敗
⑤ 通過Realm進(jìn)行認(rèn)證最終的邏輯判斷,我們此處以應(yīng)用只存在單個Realm來進(jìn)行介紹。Realm首先會通過realm.supports(token)進(jìn)行驗證,驗證Realm是否支持對應(yīng)的token進(jìn)行認(rèn)證操作,如果返回true,將會進(jìn)行認(rèn)證邏輯處理,否則直接忽略認(rèn)證邏輯,如果我們的應(yīng)用只想處理授權(quán),可以自定義Realm,并將supports方法返回false即可。
Realm會通過token與INI配置文件中的配置項進(jìn)行對比,或者與我們數(shù)據(jù)庫存儲的數(shù)據(jù)進(jìn)行對比,如果相同則認(rèn)證通過。
下一小節(jié),我們將通過IniRealm來介紹Shiro是如何進(jìn)行認(rèn)證邏輯判斷的
1.4 IniRealm認(rèn)證實現(xiàn)
在上篇文章中,我們提到,Shiro默認(rèn)使用IniRealm,但是前提是我們在INI配置中指定了[users]或[roles]有效配置數(shù)據(jù),否則就會用配置中指定的securityManager的realms,如果兩者都沒有指定那么就會拋出錯誤,因為Shiro應(yīng)用,至少要配置一個Realm
IniRealm在初始化onInit()時,會將已經(jīng)加載的INI文件中的[users]、[roles]配置進(jìn)行處理,分別轉(zhuǎn)換為SimpleRole、SimpleAccount,再將SimpleAccount與SimpleRole進(jìn)行綁定,至此,IniRealm對INI配置文件處理已經(jīng)完畢。
但是認(rèn)證的操作并沒有完成,IniRealm仍需要與傳遞過來的token進(jìn)行對比,判斷是否相同,具體的判斷邏輯交由AuthenticatingRealm來進(jìn)行。
1.5 AuthenticatingRealm
AuthenticatingRealm是Realm的頂級抽象實現(xiàn)類,主要用于處理認(rèn)證操作,至于授權(quán)等操作則交由該類的子類去處理。
AuthenticatingRealm拿到token后,會先去緩存中查找是否存在對應(yīng)的認(rèn)證信息,如果存在直接使用緩存中的認(rèn)證信息與token進(jìn)行比對,如果緩存中不存在,則直接獲取IniRealm中的認(rèn)證信息進(jìn)行比對,比對通過后,返回認(rèn)證成功的Subject對象。
至此,認(rèn)證的整體過程與底層邏輯已經(jīng)全部介紹完畢。如果文章有什么不足之處,或者說的不正確的地方,也希望各位小伙伴們與我聯(lián)系和溝通。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67441.html
摘要:授權(quán)三大要素是安全框架中最原子性的元素,它用來描述能夠做什么或者說能夠執(zhí)行什么樣的操作,比如刪除用戶查看用戶詳情查看商品詳情等。用戶就是我們之前提到的三大核心概念之一的。 在上篇Shiro認(rèn)證原理的最后,我們介紹了IniRealm是如何進(jìn)行認(rèn)證,本篇我們將介紹Shiro授權(quán)過程中的幾個概念以及Shiro編程式的授權(quán)操作,并通過常用的用戶、角色、權(quán)限授權(quán)模式來加深理解授權(quán)的過程。 1 授...
摘要:我認(rèn)為無論是也好,還是其他安全框架也好,其功能主要就分為三部分認(rèn)證授權(quán)加密。的認(rèn)證授權(quán)管理,都需要由負(fù)責(zé)。構(gòu)建環(huán)境主體提交認(rèn)證請求認(rèn)證創(chuàng)建環(huán)境,我們這里使用的是。最后我們使用進(jìn)行認(rèn)證。認(rèn)證我們先說這么多,下節(jié)我們來說說的簡單授權(quán)。 showImg(https://segmentfault.com/img/bV8VRT?w=800&h=119); 時隔這么久終于有時間更新了,今天和大家分...
摘要:框架具有輕便,開源的優(yōu)點,所以本譯見構(gòu)建用戶管理微服務(wù)五使用令牌和來實現(xiàn)身份驗證往期譯見系列文章在賬號分享中持續(xù)連載,敬請查看在往期譯見系列的文章中,我們已經(jīng)建立了業(yè)務(wù)邏輯數(shù)據(jù)訪問層和前端控制器但是忽略了對身份進(jìn)行驗證。 重拾后端之Spring Boot(四):使用JWT和Spring Security保護(hù)REST API 重拾后端之Spring Boot(一):REST API的搭建...
摘要:是什么是功能強大簡單易用的安全框架,核心功能包括認(rèn)證授權(quán)加密以及管理。的主要作用就是用來執(zhí)行認(rèn)證和授權(quán)的邏輯,它其實就相當(dāng)于與安全數(shù)據(jù)用戶賬號密碼角色權(quán)限之間進(jìn)行交互的橋梁。至此,的三個核心概念已經(jīng)介紹完畢。 1、Shiro是什么 Shiro是功能強大、簡單易用的Java安全框架,核心功能包括:認(rèn)證、授權(quán)、加密以及Session管理。Shiro的應(yīng)用范圍很廣泛,小型移動端應(yīng)用、大型We...
閱讀 2213·2021-10-18 13:28
閱讀 2529·2021-10-11 10:59
閱讀 2352·2019-08-29 15:06
閱讀 1142·2019-08-26 13:54
閱讀 821·2019-08-26 13:52
閱讀 3156·2019-08-26 12:02
閱讀 3009·2019-08-26 11:44
閱讀 2521·2019-08-26 10:56