debug代碼解析shiro認證流程

debug代碼解析shiro認證流程的示例代碼https://gitee.com/158cosmos/springboot_shiro.git

Apache Shiro™是一個優秀的開源權限控制框架,首先看一下官網的框架架構圖以及對它的介紹


介紹:
Apache Shiro™ is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management. With Shiro’s easy-to-understand API, you can quickly and easily secure any application – from the smallest mobile applications to the largest web and enterprise applications.
其中shiro最主要的幾個組件都在圖中:authenticator(認證器),authorizer(授權器),sessionManager(session管理器),cacheManager(緩存管理器),cryptography(加密),sessionDao,Reamls,除了cryptography以外其他的組件都在securityManager中,securityManager是shiro的核心,所有的組件都應依靠它來調用,shiro使用機制-策略的設計模式,所有的組件都可以拔插,可以靈活的替換到自己的實現,用來實現用戶自己策略


debug代碼解析shiro的工作機制,如何調用到我們註冊的realms,執行我們的認證策略,前提條件是我們已經熟悉的shiro的簡單使用。
1、第一步,客戶端封裝usernamePasswordToken,調用login(),這是程序的入口;


2、debug代碼追源碼,點進login()t源碼
解析:
①清除掉現有的憑證
②調用SecurityManager.login(),前面說了SecurityManager是shiro的核心,掌握着認證機制,從而調用到我們的認證策略


3、繼續點進SecurityManager.login()


解析:圈紅圈的authenticator很眼熟,就是之前架構圖的的認證器
4、繼續點進認證器


解析:圈紅圈的Realms也很熟悉,就是我們架構圖裏的Pluggable realms,可拔插的realms(支持一個或多個),再看下一行,檢查一下realms的個數,如果是一個,執行單個認證方法,如果是多個,執行多個認證方法,這裏說明一下:如果是多個realms的話必須同時指定認證策略(貌似支持三種認證策略,默認是一個realms認證通過算認證成功,感興趣可百度),這裏我配置了一個realm,亮出配置xml,這裏我也配置了認證策略器(冗餘,一個realm時不需要配)
5、點進單個realm認證方法
解析:分兩步。第一步參數檢查,第二步調用realm.getAuthenticationInfo();getAuthenticationInfo()裏的第一步獲取緩存(這裏涉及到架構圖裏的CacheManager),如果緩存爲空執行第二步用戶自己的認證策略,第三步如果我們配置了緩存就把它存入緩存,這裏我們關注點不在緩存,繼續
6、繼續點進doGetAuthenticationInfo(),這一步很重要,因爲這個方法最終會調用我們自己的代碼,這是在配置文件中指定的,由於重寫了這個方法,所以基於java多態特性最終會調用到我自己的認證邏輯org\apache\shiro\shiro-core\1.2.5\shiro-core-1.2.5.jar!\org\apache\shiro\realm\AuthenticatingRealm.class
解析:這是一個抽象的方法,生來就是註定要被繼承的
點進去看實現,我實現了shiroReaml,並在配置文件中注入進securityManager中,所以shiro最終必須要調用我的reaml,而不會是其他的realm,很強硬。
7、點進實現,調用自己的認證策略
解析:這裏的邏輯是從數據庫中查詢賬號,如果存在將密碼封裝到Info中返回,我們不負責匹配,交給shiro去匹配,這樣shiro擁有了前端傳來的usernamePasswordToken,數據庫查詢出的密碼,自然可以進行密碼匹配(爲什麼要交給shiro去匹配是因爲還涉及到加密匹配的問題,也就是架構圖中的cryptography)
8、回退到第五步,倒數第4行,拿到我們返回Info和傳入的token匹配,如果匹配失敗拋出異常,成功返回Info(這個匹配器也是可以配置的 我們也可以改源碼實現我們自己的匹配邏輯和加密策略)
9、繼續回退到第三步
解析:這裏152行和163行還涉及到一個登錄成功和登錄失敗的監聽器,最重要的是第162行的createSubject()方法
解析:將Subject的狀態置爲認證通過,並把pricipal(憑證)放入Subject。
10、繼續回退,回退到我們的調用者,isAutenticated()則會返回true。自此,調用流程跑完
總結:
①看源碼的步驟第一步應當是看懂架構圖,從總體對框架有個把握,弄懂他的機制,再去看比較細的策略
②看源碼的過程中應當一步一步截圖記錄下來或者用流程圖時序圖記錄下來,不然很容易跳來跳去最終跳到暈頭轉向
不足:
shiro的web情況下createSubject()和getSubject()也有很多值得追源碼的地方,用來維護會話,有時間應徹底看完。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章