雖然目前 Spring Security 一片火熱,但是 Shiro 的市場依然存在,今天我就來稍微的說一說這兩個框架的,方便大家在實際項目中選擇適合自己的安全管理框架。
首先我要聲明一點,框架無所謂好壞,關鍵是適合當前項目場景,作為一個年輕的程序員更不應該厚此薄彼,或者拒絕學習某一個框架。
小孩子才做選擇題,成年人兩個都要學!
所以接下來主要結合我自己的經驗來說一說這兩個框架的優缺點,沒有提到的地方也歡迎大家留言補充。
1. Spring Security
1.1 因為 SpringBoot 而火
Spring Security 並非一個新生的事物,它最早不叫 Spring Security ,叫 Acegi Security,叫 Acegi Security 並不是說它和 Spring 就沒有關係了,它依然是為 Spring 框架提供安全支持的。事實上,Java 領域的框架,很少有框架能夠脫離 Spring 框架獨立存在。
當 Spring Security 還叫 Acegi Security 的時候,雖然功能也還可以,但是實際上這個東西並沒有廣泛流行開來。最重要的原因就是它的配置太過於繁瑣,當時網上流傳一句話:“每當有人要使用 Acegi Security,就會有一個精靈死去。” 足見 Acegi Security 的配置是多麼可怕。直到今天,當人們談起 Spring Security 的時候,依然在吐槽它的配置繁瑣。
後來 Acegi Security 投入 Spring 的懷抱,改名叫 Spring Security,事情才慢慢開始發生變化。新的開發團隊一直在盡力簡化 Spring Security 的配置,Spring Security 的配置相比 Acegi Security 確實簡化了很多。但是在最初的幾年裡,Spring Security 依然無法得到廣泛的使用。
直到有一天 Spring Boot 像謎一般出現在江湖邊緣,徹底顛覆了 JavaEE 的世界。一人得道雞犬升天,自從 Spring Boot 火了之後,Spring 家族的產品都被帶了一把,Spring Security 就是受益者之一,從此飛上枝頭變鳳凰。
Spring Boot/Spring Cloud 現在作為 Java 開發領域最最主流的技術棧,這一點大家應該都沒有什麼異議,而在 Spring Boot/Spring Cloud 中做安全管理,Spring Security 無疑是最方便的。
你想保護 Spring Boot 中的接口,添加一個 Spring Security 的依賴即可,事情就搞定了,所有接口就保護起來了,甚至不需要一行配置。
有小夥伴可能覺得這個太籠統了,我再舉一個實際點的例子。
在微服務架構的項目中,我們可能使用 Eureka 做服務註冊中心,默認情況下,Eureka 沒有做安全管理,如果你想給 Eureka 添加安全管理,只需要添加 Spring Security 依賴,然後在application.properties 中配置一下用戶名密碼即可,Eureka 就自動被保護起來了,別人無法輕易訪問;然後各個微服務在註冊的時候,只需要把註冊地址改為 http://username:password@localhost:8080/eureka 即可。類似的例子還有 Spring Cloud Config 中的安全管理。
在微服務這種場景下,如果你想用 Shiro 代替 Spring Security,那 Shiro 代碼量絕對非常可觀,Spring Security 則可以非常容易的集成到現在流行的 Spring Boot/Spring Cloud 技術棧中,可以和 Spring Boot、Spring Cloud、Spring Social、WebSocket 等非常方便的整合。
所以我說,因為 Spring Boot/Spring Cloud 火爆,讓 Spring Security 跟著沾了一把光。
1.2 配置臃腫嗎?
「有的人覺得 Spring Security 配置臃腫。」
如果是 SSM + Spring Security 的話,我覺得這話有一定道理。
但是如果是 Spring Boot 項目的話,其實並不見得臃腫。Spring Boot 中,通過自動化配置 starter 已經極大的簡化了 Spring Security 的配置,我們只需要做少量的定製的就可以實現認證和授權了。
「有人覺得 Spring Security 中概念複雜。」這個是這樣的,沒錯。
Spring Security 由於功能比較多,支持 OAuth2 等原因,就顯得比較重量級,不像 Shiro 那樣輕便。
但是如果換一個角度,你可能會有不一樣的感受。
在 Spring Security 中你會學習到許多安全管理相關的概念,以及常見的安全攻擊。這些安全攻擊,如果你不是 web 安全方面的專家,很多可能存在的 web 攻擊和漏洞你可能很難想到,而 Spring Security 則把這些安全問題都給我們羅列出來並且給出了相應的解決方案。
所以我說,我們學習 Spring Security 的過程,也是在學習 web 安全,各種各樣的安全攻擊、各種各樣的登錄方式、各種各樣你能想到或者想不到的安全問題,Spring Security 都給我們羅列出來了,並且給出瞭解決方案,從這個角度來看,你會發現 Spring Security 好像也不是那麼讓人討厭。
1.3 結合微服務的優勢
除了前面和大家介紹的 Spring Security 優勢,在微服務中,Spring 官方推出了 Spring Cloud Security 和 Spring Cloud OAuth2,結合微服務這種分佈式特性,可以讓我們更加方便的在微服務中使用 Spring Security 和 OAuth2,松哥前面的 OAuth2 系列實際上都是基於 Spring Cloud Security 來做的。
可以看到,Spring 官方一直在積極進取,讓 Spring Security 能夠更好的集成進微服務中。
2. Shiro
接下來我們再說說 Apache Shiro。
Apache Shiro 是一個開源安全框架,提供身份驗證、授權、密碼學和會話管理。Shiro 框架具有直觀、易用等特性,同時也能提供健壯的安全性,雖然它的功能不如 Spring Security 那麼強大,但是在常規的企業級應用中,其實也夠用了。
2.1 由來
Shiro 的前身是 JSecurity,2004 年,Les Hazlewood 和 Jeremy Haile 創辦了 Jsecurity。當時他們找不到適用於應用程序級別的合適 Java 安全框架,同時又對 JAAS 非常失望,於是就搞了這個東西。
2004 年到 2008 年期間,JSecurity 託管在 SourceForge 上,貢獻者包括 Peter Ledbrook、Alan Ditzel 和 Tim Veil。
2008 年,JSecurity 項目貢獻給了 Apache 軟件基金會(ASF),並被接納成為 Apache Incubator 項目,由導師管理,目標是成為一個頂級 Apache 項目。期間,Jsecurity 曾短暫更名為 Ki,隨後因商標問題被社區更名為“Shiro”。隨後項目持續在 Apache Incubator 中孵化,並增加了貢獻者 Kalle Korhonen。
2010 年 7 月,Shiro 社區發佈了 1.0 版,隨後社區創建了其項目管理委員會,並選舉 Les Hazlewood 為主席。2010 年 9 月 22 日,Shrio 成為 Apache 軟件基金會的頂級項目(TLP)。
2.2 有哪些功能
Apache Shiro 是一個強大而靈活的開源安全框架,它乾淨利落地處理身份認證,授權,企業會話管理和加密。Apache Shiro 的首要目標是易於使用和理解。安全有時候是很複雜的,甚至是痛苦的,但它沒有必要這樣。框架應該儘可能掩蓋複雜的地方,露出一個乾淨而直觀的 API,來簡化開發人員在應用程序安全上所花費的時間。
以下是你可以用 Apache Shiro 所做的事情:
- 驗證用戶來核實他們的身份
- 對用戶執行訪問控制,如:判斷用戶是否被分配了一個確定的安全角色;判斷用戶是否被允許做某事
- 在任何環境下使用Session API,即使沒有Web容器
- 在身份驗證,訪問控制期間或在會話的生命週期,對事件作出反應
- 聚集一個或多個用戶安全數據的數據源,並作為一個單一的複合用戶“視圖”
- 單點登錄(SSO)功能
- 為沒有關聯到登錄的用戶啟用"Remember Me"服務
- ...
Apache Shiro 是一個擁有許多功能的綜合性的程序安全框架。下面的圖表展示了 Shiro 的重點:
Shiro 中有四大基石——身份驗證,授權,會話管理和加密。
- Authentication:有時也簡稱為“登錄”,這是一個證明用戶是誰的行為。
- Authorization:訪問控制的過程,也就是決定“誰”去訪問“什麼”。
- Session Management:管理用戶特定的會話,即使在非 Web 或 EJB 應用程序。
- Cryptography:通過使用加密算法保持數據安全同時易於使用。
除此之外,Shiro 也提供了額外的功能來解決在不同環境下所面臨的安全問題,尤其是以下這些:
- Web Support:Shiro 的 web 支持的 API 能夠輕鬆地幫助保護 Web 應用程序。
- Caching:緩存是 Apache Shiro 中的第一層公民,來確保安全操作快速而又高效。
- Concurrency:Apache Shiro 利用它的併發特性來支持多線程應用程序。
- Testing:測試支持的存在來幫助你編寫單元測試和集成測試。
- "Run As":一個允許用戶假設為另一個用戶身份(如果允許)的功能,有時候在管理腳本很有用。
- "Remember Me":在會話中記住用戶的身份,這樣用戶只需要在強制登錄時候登錄。
2.3 學習資料
Shiro 的學習資料並不多,沒看到有相關的書籍。張開濤的《跟我學Shiro》是一個非常不錯的資料,小夥伴可以搜索瞭解下。也可以在公眾號後臺回覆 2TB,有相關的視頻教程。
2.4 優勢和劣勢
就目前而言,Shiro 最大的問題在於和 Spring 家族的產品進行整合的時候非常不便,在 Spring Boot 推出的很長一段時間裡,Shiro 都沒有提供相應的 starter,後來雖然有一個 shiro-spring-boot-web-starter 出來,但是其實配置並沒有簡化多少。所以在 Spring Boot/Spring Cloud 技術棧的微服務項目中,Shiro 幾乎不存在優勢。
但是如果你是傳統的 SSM 項目,不是微服務項目,那麼無疑使用 Shiro 是最方便省事的,因為它足夠簡單,足夠輕量級。
3. 如何取捨
在公司裡做開發,這兩個要如何取捨,還是要考慮蠻多東西的。
首先,如果是基於 Spring Boot/Spring Cloud 的微服務項目,Spring Security 無疑是最方便的。
如果是就是普通的 SSM 項目,那麼 Shiro 基本上也夠用。
另外,選擇技術棧的時候,我們可能也要考慮團隊內工程師的技術棧,如果工程師更擅長 Shiro,那麼無疑 Shiro 是合適的,畢竟讓工程師去學習一門新的技術,一來可能影響項目進度,而來也可能給項目埋下許多未知的雷。
對於我們個人來說,小孩子才做選擇題,成年人兩個都要學。