【登錄及鑑權】-盤點那些主流的開源登錄及權限認證框架 (上)

登錄和鑑權應該是一個完整的系統中幾乎必不可少的部分,雖然現在已經有越來越多的框架幫我們簡化了這部分工作量,大公司更是有自己專門的登錄和權限控制系統,比如阿里的BUC和ACL,開發者僅需要通過簡單的步驟便可接入功能完備的登錄和權限控制系統,這部分通用能力下沉成爲中間件,但沒有開源,對小公司而言,登錄和鑑權還是得依賴開源的框架,所以在此盤點一下當下最常用的幾款登錄和鑑權框架:spring-security,apache-shiro,outh2.0.

本專題共分爲上下兩篇,上篇講理論,下篇實戰.


花絮:什麼是RBAC?

開篇前有必要先說一下RBAC,因爲目前99%的登錄和權限控制框架都是基於RBAC的,RBAC是基於角色的訪問控制(Role-Based Access Control)在RBAC中,權限與角色相關聯,用戶通過成爲適當角色的成員而得到這些角色的權限。這就極大地簡化了權限的管理。這樣管理都是層級相互依賴的,權限賦予給角色,而把角色又賦予用戶,這樣的權限設計很清楚,管理起來很方便。

1.Spring-security

SpringSecurity在前幾年似乎並沒有今天用的人這麼多,因爲框架比較重,而且配置繁瑣,直到springboot出現,局勢開始扭轉,現在使用Spring全家桶纔是主流.SpringSecurity是通過一系列filter過濾器來實現登錄和權限的控制,這麼說可能比較籠統.引用一張網圖(出處見水印)來描述整個SpringSecurity的登錄和鑑權過程:

沒看懂?沒關係,我簡化一下上面的步驟,分爲兩個過程,登錄和鑑權:

登錄:用戶輸入賬號和密碼,發送表單至服務器,服務器通過對用戶輸入的密碼按照創建時相同的加密方式加密,然後與數據庫中的賬號密碼比對,如果一致就通過登錄,否則提示用戶,這步比較簡單.

重點來看鑑權:

由於SpringSecurity和Shiro都是基於RBAC的,所以原理都如這兩張圖所示,先獲取當前用戶的角色,然後根據角色獲取權限列表,然後逐個判斷是否包含所訪問內容的權限.

這樣看來是不是非常簡單?沒錯,這正是RBAC的強大之處.

聊完了原理再來看看SpringSecurity的幾個核心類:

Authentication

 Authentication是一個接口,用來表示用戶認證信息的,在用戶登錄後會將用戶權限等信息封裝進去,然後 保存在SecurityContextHolder 所持有的 SecurityContext 上下文中,供後續調用.

SecurityContextHolder

其實也沒啥好說的,但它比較重要,還是囉嗦一下,它就是一個線程安全的Holder,裏面用ThreadLocal hold了SecurityContext,提供了靜態方法供調用者獲取SecurityContext.

AuthenticationManager 和 AuthenticationProvider

AuthenticationManager 是一個用來處理認證請求的接口,如果認證成功後會返回一個包含用戶權限等詳細信息的Authentication對象,AuthenticationProvider其實就是AuthenticationManager的一個默認實現類,認證成功後的Authentication 對象將會保存在當前的 SecurityContext 中.

Authentication

UserDetailsService中定義了一些可以獲取用戶名、密碼、權限等與認證相關的信息的方法,Authentication對象裏的內容其實來源於UserDetails.當然最終還是來源於數據庫.

關於SprigSecurity的理論部分就囉嗦這麼多,下面看看shiro.

 


2.Apache-Shiro

Shiro因爲其輕量,使用簡單,也受到衆多開發者青睞,麻雀雖小,五臟俱全.

Shiro的工作過程如圖所示:

Subject:主體,可以狹義的理解爲當前要登錄的對象.

SecurityManager:安全管理器,即所有與安全有關的操作都會與 SecurityManager 交互,管理所有的主體.

Realm:域,泛指從數據庫中獲取到的如用戶、角色、權限等關聯信息.

沒啥好解釋的,shiro本身就比較簡單清晰,結合RBAC理論就更好理解了.

完整的工作流程如下圖:

①獲取主體Suject->②委託給Security Manager去處理->③實際執行者爲Autherticator->④選擇指定的認證策略->⑤通過Realm(一般是JDBC Realm)去底層數據庫拉取用戶及角色和權限信息


3.Oauth2.0

Oauth應該是繼單點登錄以後最大的一個實用功能了,可以極大的提高用戶體驗.

Oauth是一種協議,開源的協議,舉個實際的例子,各位都應該不陌生,我想登錄慕課網,但我並不想註冊賬號,這時候就可以通過

點擊這裏,比如我點了QQ,就可以通過QQ賬號授權給慕課網,避免我再註冊個慕課網的賬號

 

授權以後就可以像註冊用戶一樣體驗慕課網的全部功能,這種方式真的體驗很好,所以Oauth在稍微大一點的系統都會有集成.

關於Oauth的原理我直接引用阮一峯老師的原話:簡單說,OAuth 就是一種授權機制。數據的所有者告訴系統,同意授權第三方應用進入系統,獲取這些數據。系統從而產生一個短期的進入令牌(token),用來代替密碼,供第三方應用使用.


單點登錄:說簡單粗暴一點就是在多個應用系統中只需要登錄一次,就可以訪問所有彼此信任的系統. 比如我登錄了支付寶可以不用再輸入賬號密碼也可以訪問淘寶,天貓.


理論部分就囉嗦這麼多,有這些基礎之後,結合代碼就比較好理解了,文中若有不正之處歡迎各路神仙留言斧正.

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