安全框架 Shiro 和 Spring Security 如何選擇?

  • 2019 年 10 月 7 日
  • 筆記

安全框架

安全框架,簡單說是對訪問許可權進行控制,應用的安全性包括用戶認證(Authentication)和用戶授權(Authorization)兩個部分。

用戶認證指的是驗證某個用戶是否為系統中的合法主體,也就是說用戶能否訪問該系統。

用戶認證一般要求用戶提供用戶名和密碼,系統通過校驗用戶名和密碼來完成認證過程。

用戶授權指的是驗證某個用戶是否有許可權執行某個操作。在一個系統中,不同用戶所具有的許可權是不同的。比如對一個文件來說,有的用戶只能進行讀取,而有的用戶可以進行修改。

一般來說,系統會為不同的用戶分配不同的角色,而每個角色則對應一系列的許可權。

Shiro

Apache Shiro是一個強大且易用的Java安全框架,能夠非常清晰的處理身份驗證、授權、管理會話以及密碼加密。

利用其易於理解的API,可以快速、輕鬆地獲得任何應用程式,從最小的移動應用程式到最大的網路和企業應用程式。

Shiro 主要分為兩個部分就是認證和授權,在個人感覺來看就是查詢資料庫做相應的判斷而已,Shiro只是一個框架而已,其中的內容需要自己的去構建,前後是自己的,中間是Shiro幫我們去搭建和配置好的。

Spring Security

Spring Security是一個能夠為基於Spring的企業應用系統提供聲明式的安全訪問控制解決方案的安全框架。

它提供了一組可以在Spring應用上下文中配置的Bean,充分利用了Spring IoC(控制反轉),DI( 依賴注入)和AOP(面向切面編程)功能,為應用系統提供聲明式的安全訪問控制功能,減少了為企業系統安全控制編寫大量重複程式碼的工作。

眾所周知,想要對對Web資源進行保護,最好的辦法莫過於Filter,要想對方法調用進行保護,最好的辦法莫過於AOP。所以Spring Security在我們進行用戶認證以及授予許可權的時候,通過各種各樣的攔截器來控制許可權的訪問,從而實現安全。

它所有的架構也是基於認證和授權這兩個核心功能去實現的。

Shiro主要功能

三個核心組件:Subject, SecurityManager 和 Realms。

Subject:即「當前操作用戶」。但是,在Shiro中,Subject這一概念並不僅僅指人,也可以是第三方進程、後台帳戶(Daemon Account)或其他類似事物。它僅僅意味著「當前跟軟體交互的東西」。

Subject代表了當前用戶的安全操作,SecurityManager則管理所有用戶的安全操作。

SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通過SecurityManager來管理內部組件實例,並通過它來提供安全管理的各種服務。

Realm:Realm充當了Shiro與應用安全數據間的「橋樑」或者「連接器」。也就是說,當對用戶執行認證(登錄)和授權(訪問控制)驗證時,Shiro會從應用配置的Realm中查找用戶及其許可權資訊。

從這個意義上講,Realm實質上是一個安全相關的DAO:它封裝了數據源的連接細節,並在需要時將相關數據提供給Shiro。當配置Shiro時,你必須至少指定一個Realm,用於認證和(或)授權。配置多個Realm是可以的,但是至少需要一個。

Shiro內置了可以連接大量安全數據源(又名目錄)的Realm,如LDAP、關係資料庫(JDBC)、類似INI的文本配置資源以及屬性文件等。如果預設的Realm不能滿足需求,你還可以插入代表自定義數據源的自己的Realm實現。

Spring Security主要功能

Spring Security對Web安全性的支援大量地依賴於Servlet過濾器。這些過濾器攔截進入請求,並且在應用程式處理該請求之前進行某些安全處理。

Spring Security提供有若干個過濾器,它們能夠攔截Servlet請求,並將這些請求轉給認證和訪問決策管理器處理,從而增強安全性。根據自己的需要,可以使用適當的過濾器來保護自己的應用程式。

如果使用過Servlet過濾器且令其正常工作,就必須在Web應用程式的web.xml文件中使用<filter> 和<filter-mapping>元素配置它們。雖然這樣做能起作用,但是它並不適用於使用依賴注入進行的配置。

FilterToBeanProxy是一個特殊的Servlet過濾器,它本身做的工作並不多,而是將自己的工作委託給Spring應用程式上下文 中的一個Bean來完成。被委託的Bean幾乎和其他的Servlet過濾器一樣,實現javax.servlet.Filter接 口,但它是在Spring配置文件而不是web.xml文件中配置的。

實際上,FilterToBeanProxy代理給的那個Bean可以是javax.servlet.Filter的任意實現。這可以是 Spring Security的任何一個過濾器,或者它可以是自己創建的一個過濾器。但是正如本書已經提到的那樣,Spring Security要求至少配置四個而且可能一打或者更多的過濾器。

Shiro特點

1、易於理解的 Java Security API;

2、簡單的身份認證(登錄),支援多種數據源(LDAP,JDBC,Kerberos,ActiveDirectory 等);

3、對角色的簡單的簽權(訪問控制),支援細粒度的簽權;

4、支援一級快取,以提升應用程式的性能;

5、內置的基於 POJO 企業會話管理,適用於 Web 以及非 Web 的環境;

6、異構客戶端會話訪問;

7、非常簡單的加密 API;

8、不跟任何的框架或者容器捆綁,可以獨立運行。

Spring Security特點

除了不能脫離Spring,shiro的功能它都有。

而且Spring Security對Oauth、OpenID也有支援,Shiro則需要自己手動實現。Spring Security的許可權細粒度更高(還未發現高在哪裡)。

註:

OAuth在"客戶端"與"服務提供商"之間,設置了一個授權層(authorization layer)。"客戶端"不能直接登錄"服務提供商",只能登錄授權層,以此將用戶與客戶端區分開來。"客戶端"登錄授權層所用的令牌(token),與用戶的密碼不同。用戶可以在登錄的時候,指定授權層令牌的許可權範圍和有效期。

"客戶端"登錄授權層以後,"服務提供商"根據令牌的許可權範圍和有效期,向"客戶端"開放用戶儲存的資料。

OpenID 系統的第一部分是身份驗證,即如何通過 URI 來認證用戶身份。目前的網站都是依靠用戶名和密碼來登錄認證,這就意味著大家在每個網站都需要註冊用戶名和密碼,即便你使用的是同樣的密碼。

如果使用 OpenID ,你的網站地址(URI)就是你的用戶名,而你的密碼安全的存儲在一個 OpenID 服務網站上(你可以自己建立一個 OpenID 服務網站,也可以選擇一個可信任的 OpenID 服務網站來完成註冊)。

與OpenID同屬性的身份識別服務商還有ⅥeID,ClaimID,CardSpace,Rapleaf,Trufina ID Card等,其中ⅥeID通用賬戶的應用最為廣泛。

總結

個人認為現階段需求,許可權的操作粒度能控制在路徑及按鈕上,數據粒度通過sql實現。Shrio簡單夠用。

至於OAuth,OpenID 站點間統一登錄功能,現租戶與各個產品間單點登錄已經通過cookies實現,所以Spring Security的這兩個功能可以不考慮。

SpringSide網站的許可權也是用Shrio做的。