天天看點

shiro安全架構源碼分析--登陸認證流程

上一篇寫了shiro的啟動加載過程的源碼分析,現在來看看相對簡單點的認證的流程源碼,先來看看官方的流程圖再對照我們日常的邏輯代碼。比較一下

shiro安全架構源碼分析--登陸認證流程

簡單的解釋下上圖的步鄹:1.生成subject并且調用login(token)方法;2.調用securityManager的login()方法;3和4.進入到doGetAuthenticationInfo()方法進行真正的認證邏輯;5.在realm中查詢資料源和傳入的token比較,有比對的就是認證成功。

shiro安全架構源碼分析--登陸認證流程

再看看自定義的realm;是繼承AuthorizingRealm的這點很重要

shiro安全架構源碼分析--登陸認證流程

總結一下上面的,其實說到底shiro認證的流程就是上面兩個截圖完成的,下面我們來分析一下源碼,看看是怎麼個過程

首先:

shiro安全架構源碼分析--登陸認證流程

點進去是DelegatingSubject實作了Subject

shiro安全架構源碼分析--登陸認證流程

接着往裡面找,找到了DefaultSecurityManager類的login()

shiro安全架構源碼分析--登陸認證流程

接着進入了

shiro安全架構源碼分析--登陸認證流程
shiro安全架構源碼分析--登陸認證流程

繼續跟着源碼走,我們來到了

shiro安全架構源碼分析--登陸認證流程
shiro安全架構源碼分析--登陸認證流程

很多情況當我們看到Abstract開頭的類的時候就離真正的目标不遠了(因為abstract有部分實作和接口方法,承上啟下的作用,上面的幾張截圖在這裡講解一下:認證器的實作類,SecurityMananger也繼承自Authenticator,通過檢視AuthenticatingSecurityManager源碼其實就是Authenticator的代理。而真正實作認證功能的Authenticator實作類隻有一個ModularRealmAuthenticator,從類的名字可以看出這個認證器的實作原理——子產品化認證器:一個Realm就是一個認證子產品。

下面來看看單一的realm的doSingleRealmAuthentication()方法

shiro安全架構源碼分析--登陸認證流程

進入到了Realm接口裡面

shiro安全架構源碼分析--登陸認證流程
shiro安全架構源碼分析--登陸認證流程

繼續找他的實作進入到了AuthenticatingRealm類(這個類就是我們開頭說的要注意的,他是我們自定義的my)

shiro安全架構源碼分析--登陸認證流程
shiro安全架構源碼分析--登陸認證流程

最後一次點進去

shiro安全架構源碼分析--登陸認證流程
shiro安全架構源碼分析--登陸認證流程

為什麼找到自定義realm裡的實作了呢,看看繼承關系就知道了

shiro安全架構源碼分析--登陸認證流程
shiro安全架構源碼分析--登陸認證流程

 到這裡就分析的差不多了,剩下的就是我們自定義MyShiroRealm裡面的doGetAuthenticationInfo方法進行認證。

最後,你以為就這樣就結束了???敲代碼是不可能的,這輩子都不可能!

忘記了這張圖麼?

shiro安全架構源碼分析--登陸認證流程

是的,借用武器大師一句話:我又回來啦。那麼認證憑證生成了,下面我們要去認證了;

老辦法點進去看assertCredentialsMatch()看看是怎麼認證的,這是 void 方法,不會傳回隻會抛異常,是以應該在這裡判斷傳回是 true 還是 false

shiro安全架構源碼分析--登陸認證流程

點進去doCredentialsMatch(),我擦,發現是個接口有四個實作類(看名字就知道是加密算法的大佬,惹不起,惹不起),我們的認證方法doCredentialsMatcher()也有這四個實作方法,我們看一下最難(簡單)的實作

shiro安全架構源碼分析--登陸認證流程
shiro安全架構源碼分析--登陸認證流程
shiro安全架構源碼分析--登陸認證流程

今天的内容總結一下:

1.建立AuthenticationToken,然後調用subject.login(token)方法進行登入認證;

2.Subject委托給SecurityManager;

3.SecurityManager委托給Authenticator接口;

4.

Authenticator接口調用 MyShiroRealm 擷取登入資訊,進行認證。

最後,說實話我感覺認證的源碼比啟動加載簡單很多,跟着源碼點進去就行了,自己也是個菜雞,有什麼不對的,請各位老鐵多多指教,多多評論,謝謝啦!

繼續閱讀