Java中security與shiro的區(qū)別詳解
一、Shiro與spring security 比較 shiro
1.框架原理圖及名詞解釋
名詞解釋
- **subject:**主體,可以是用戶也可以是程序,主體要訪問系統(tǒng),系統(tǒng)需要對主體進(jìn)行認(rèn)證、授權(quán)。
- securityManager:安全管理器,主體進(jìn)行認(rèn)證和授權(quán)都是通過securityManager進(jìn)行。它包含下面的認(rèn)證器和授權(quán)器。
- authenticator:認(rèn)證器,主體進(jìn)行認(rèn)證最終通過authenticator進(jìn)行的。
- authorizer:授權(quán)器,主體進(jìn)行授權(quán)最終通過authorizer進(jìn)行的。
- sessionManager:web應(yīng)用中一般是用web容器對session進(jìn)行管理,shiro也提供一套session管理的方式??梢詫崿F(xiàn)單點(diǎn)登錄。
- SessionDao:通過SessionDao管理session數(shù)據(jù),針對個性化的session數(shù)據(jù)存儲需要使用sessionDao。
- cache Manager:緩存管理器,主要對session和授權(quán)數(shù)據(jù)進(jìn)行緩存,比如將授權(quán)數(shù)據(jù)通過cacheManager進(jìn)行緩存管理,和ehcache整合對緩存數(shù)據(jù)進(jìn)行管理。
- realm:域,領(lǐng)域,相當(dāng)于數(shù)據(jù)源,通過realm存取認(rèn)證、授權(quán)相關(guān)數(shù)據(jù)。(它的主要目的是與數(shù)據(jù)庫打交道,查詢數(shù)據(jù)庫中的認(rèn)證的信息(比如用戶名和密碼),查詢授權(quán)的信息(比如權(quán)限的code等,所以這里可以理解為調(diào)用數(shù)據(jù)庫查詢一系列的信息,一般情況下在項目中采用自定義的realm,因為不同的業(yè)務(wù)需求不一樣))
注意:在realm中存儲授權(quán)和認(rèn)證的邏輯。
- **cryptography:**密碼管理,提供了一套加密/解密的組件,方便開發(fā)。比如提供常用的散列、加/解密等功能,比如md5散列算法。
認(rèn)證原理圖
subject(主體)請求認(rèn)證,調(diào)用subject.login(token)
SecurityManager(安全管理器)執(zhí)行認(rèn)證
SecurityManager通過ModularRealmAuthenticator進(jìn)行認(rèn)證。
ModularRealmAuthenticator將token傳給realm,realm根據(jù)token中用戶信息從數(shù)據(jù)庫查詢用戶信息(包括身份和憑證),realm如果查詢不到用戶給ModularRealmAuthenticator返回null,ModularRealmAuthenticator拋出異常(用戶不存在),realm如果查詢到用戶給ModularRealmAuthenticator返回AuthenticationInfo(認(rèn)證信息),ModularRealmAuthenticator拿著AuthenticationInfo(認(rèn)證信息)去進(jìn)行憑證(密碼)比對。如果一致則認(rèn)證通過,如果不致拋出異常(憑證錯誤)。
授權(quán)原理圖
授權(quán)流程
對subject進(jìn)行授權(quán),調(diào)用方法isPermitted(“”)或者h(yuǎn)asRole(“”)
SecurityManager執(zhí)行授權(quán),通過ModularRealmAuthorizer執(zhí)行授權(quán)
ModularRealmAuthorizer執(zhí)行realm(自定義的CustomRealm)從數(shù)據(jù)庫查詢權(quán)限數(shù)據(jù)調(diào)用realm的授權(quán)方法:doGetAuthorizationInfo
realm從數(shù)據(jù)庫查詢權(quán)限數(shù)據(jù),返回ModularRealmAuthorizer
ModularRealmAuthorizer調(diào)用PermissionResolver進(jìn)行權(quán)限串比對
如果比對后,isPermitted中"permission串"在realm查詢到權(quán)限數(shù)據(jù)中,說明用戶訪問permission串有權(quán)限,否則沒有權(quán)限,拋出異常。
二、Spring Security簡介
Spring Security是一個能夠為基于Spring的企業(yè)應(yīng)用系統(tǒng)提供聲明式的安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應(yīng)用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反轉(zhuǎn)Inversion of Control ,DI:Dependency Injection 依賴注入)和AOP(面向切面編程)功能,為應(yīng)用系統(tǒng)提供聲明式的安全訪問控制功能,減少了為企業(yè)系統(tǒng)安全控制編寫大量重復(fù)代碼的工作。它是一個輕量級的安全框架,它確?;赟pring的應(yīng)用程序提供身份驗證和授權(quán)支持。它與Spring MVC有很好地集成,并配備了流行的安全算法實現(xiàn)捆綁在一起。安全主要包括兩個操作“認(rèn)證”與“驗證”(有時候也會叫做權(quán)限控制)。“認(rèn)證”是為用戶建立一個其聲明的角色的過程,這個角色可以一個用戶、一個設(shè)備或者一個系統(tǒng)。“驗證”指的是一個用戶在你的應(yīng)用中能夠執(zhí)行某個操作。在到達(dá)授權(quán)判斷之前,角色已經(jīng)在身份認(rèn)證過程中建立了。
它的設(shè)計是基于框架內(nèi)大范圍的依賴的,可以被劃分為以下幾塊。
核心組件
1.SecurityContextHolder
SecurityContextHolder它持有的是安全上下文(security context)的信息。當(dāng)前操作的用戶是誰,該用戶是否已經(jīng)被認(rèn)證,他擁有哪些角色權(quán)等等,這些都被保存在SecurityContextHolder中。SecurityContextHolder默認(rèn)使用ThreadLocal 策略來存儲認(rèn)證信息。看到ThreadLocal 也就意味著,這是一種與線程綁定的策略。在web環(huán)境下,Spring Security在用戶登錄時自動綁定認(rèn)證信息到當(dāng)前線程,在用戶退出時,自動清除當(dāng)前線程的認(rèn)證信息。
2.SecurityContext
安全上下文,主要持有Authentication對象,如果用戶未鑒權(quán),那Authentication對象將會是空的。該示例可以通過SecurityContextHolder.getContext靜態(tài)方法獲取。
3.Authentication
鑒權(quán)對象,該對象主要包含了用戶的詳細(xì)信息(UserDetails)和用戶鑒權(quán)時所需要的信息,如用戶提交的用戶名密碼、Remember-me Token,或者digest hash值等,按不同鑒權(quán)方式使用不同的Authentication實現(xiàn)。
Authentication是spring security包中的接口,直接繼承自Principal類,而Principal是位于java.security包中的??梢砸姷?,Authentication在spring security中是最高級別的身份/認(rèn)證的抽象。由這個頂級接口,我們可以得到用戶擁有的權(quán)限信息列表,密碼,用戶細(xì)節(jié)信息,用戶身份信息,認(rèn)證信息。
4.GrantedAuthority
該接口表示了當(dāng)前用戶所擁有的權(quán)限(或者角色)信息。這些信息有授權(quán)負(fù)責(zé)對象AccessDecisionManager來使用,并決定最終用戶是否可以訪問某資源(URL或方法調(diào)用或域?qū)ο螅hb權(quán)時并不會使用到該對象。
5.UserDetails
這個接口規(guī)范了用戶詳細(xì)信息所擁有的字段,譬如用戶名、密碼、賬號是否過期、是否鎖定等。在Spring Security中,獲取當(dāng)前登錄的用戶的信息,一般情況是需要在這個接口上面進(jìn)行擴(kuò)展,用來對接自己系統(tǒng)的用戶
6.UserDetailsService
這個接口只提供一個接口loadUserByUsername(String username),這個接口非常重要,一般情況我們都是通過擴(kuò)展這個接口來顯示獲取我們的用戶信息,用戶登錄時傳遞的用戶名和密碼也是通過這里這查找出來的用戶名和密碼進(jìn)行校驗,但是真正的校驗不在這里,而是由AuthenticationManager以及AuthenticationProvider負(fù)責(zé)的,需要強(qiáng)調(diào)的是,如果用戶不存在,不應(yīng)返回NULL,而要拋出異常UsernameNotFoundException
7.AuthenticationManager
AuthenticationManager(接口)是認(rèn)證相關(guān)的核心接口,也是發(fā)起認(rèn)證的出發(fā)點(diǎn),因為在實際需求中,我們可能會允許用戶使用用戶名+密碼登錄,同時允許用戶使用郵箱+密碼,手機(jī)號碼+密碼登錄,甚至,可能允許用戶使用指紋登錄(還有這樣的操作?沒想到吧),所以說AuthenticationManager一般不直接認(rèn)證,AuthenticationManager接口的常用實現(xiàn)類ProviderManager 內(nèi)部會維護(hù)一個List列表,存放多種認(rèn)證方式,實際上這是委托者模式的應(yīng)用(Delegate)。也就是說,核心的認(rèn)證入口始終只有一個:AuthenticationManager,不同的認(rèn)證方式:用戶名+密碼(UsernamePasswordAuthenticationToken),郵箱+密碼,手機(jī)號碼+密碼登錄則對應(yīng)了三個AuthenticationProvider。其中有一個重要的實現(xiàn)類是ProviderManager
8、DaoAuthenticationProvider
AuthenticationProvider最最最常用的一個實現(xiàn)便是DaoAuthenticationProvider。顧名思義,Dao正是數(shù)據(jù)訪問層的縮寫,也暗示了這個身份認(rèn)證器的實現(xiàn)思路。主要作用:它獲取用戶提交的用戶名和密碼,比對其正確性,如果正確,返回一個數(shù)據(jù)庫中的用戶信息(假設(shè)用戶信息被保存在數(shù)據(jù)庫中)。
三、比較一下shiro與SpringSecurity
Shiro 的優(yōu)點(diǎn):
首先Shiro較之 Spring Security,Shiro在保持強(qiáng)大功能的同時,還在簡單性和靈活性方面擁有巨大優(yōu)勢。
Shiro是一個強(qiáng)大而靈活的開源安全框架,能夠非常清晰的處理認(rèn)證、授權(quán)、管理會話以及密碼加密。如下是它所具有的特點(diǎn):
- 易于理解的 Java Security API;
- 簡單的身份認(rèn)證(登錄),支持多種數(shù)據(jù)源(LDAP,JDBC,Kerberos,ActiveDirectory 等);
- 對角色的簡單的簽權(quán)(訪問控制),支持細(xì)粒度的簽權(quán);
- 支持一級緩存,以提升應(yīng)用程序的性能;
- 內(nèi)置的基于 POJO 企業(yè)會話管理,適用于 Web 以及非 Web 的環(huán)境;
- 異構(gòu)客戶端會話訪問;
- 非常簡單的加密 API;
- 不跟任何的框架或者容器捆綁,可以獨(dú)立運(yùn)行。
- Shiro則是一個輕量級的安全管理框架,Shiro概念簡單、配置簡單,Shiro功能簡單, Shiro 比 Spring security 更容易使用,實現(xiàn)和最深入的理解
- Apache Shiro在Spring Security處理密碼學(xué)方面有一個額外的模塊
- Shiro 是Apache 下的項目比較可靠,且不跟任何的框架或者容器綁定,可以獨(dú)立于任何項目運(yùn)行
- 從使用情況上看,二者都在逐步提高使用量。shiro的使用量一直高于spring security. shiro可以用于非web環(huán)境,不跟任何框架或容器綁定,獨(dú)立運(yùn)行shiro入門更加容易,使用起來也非常簡單,這也是造成shiro的使用量一直高于Spring Security的主要原因
spring security 優(yōu)點(diǎn)
? Spring Security是一個重量級的安全管理框架,Spring Security更加知名的唯一原因是因為品牌名稱, Spring Security功能強(qiáng)大,Spring Security有更好的社區(qū)支持
由于Spring Boot官方提供了大量的非常方便的開箱即用的 Starter,包括 Spring Security 的 Starter,使得在SpringBoot 中使用 Spring Security 變得更加容易,甚至只需要添加一個依賴 就可以保護(hù)所有接口,所以如果是SpringBoot項目,一般選擇Spring Security。當(dāng)然這只是 一個建議的組合,單純從技術(shù)上來說,無論怎么組合,都是沒有問題的。在沒有Spring Boot之前,Spring Security的大部分配置要通過XML實現(xiàn),配置還是還是非常復(fù)雜的。但是有了 Spring Boot之后,這一情況已經(jīng)得到顯著改善。
Spring Security之所以看上去比shiro更復(fù)雜,其實是因為它引入了一些不常用的概念與規(guī)則。大家應(yīng)該都知道2/8法則,這在Spring Security里面體現(xiàn)的特別明顯,如果你只學(xué)Spring Security最重要的那20%,這20%的復(fù)雜度和shiro基本是一致的。也就是說,不重要的那80%,恰恰是Spring Security比shiro的“復(fù)雜度”。
也就是說,你把Spring Security最重要的那20%熟練掌握,二者的入門門檻、復(fù)雜度其實是差不太多的。
Spring Security依托于Spring龐大的社區(qū)支持,這點(diǎn)自不必多說。shiro屬于apache社區(qū),因為它的廣泛使用,文檔也非常的全面。二者從社區(qū)支持來看,幾乎不相上下。
但是從社區(qū)發(fā)展的角度看,Spring Security明顯更占優(yōu)勢,隨著Spring Cloud、Spring Boot、Spring Social的長足進(jìn)步,這種優(yōu)勢會越來越大。因為Spring Security畢竟是Spring的親兒子,Spring Security未來在于Spring系列框架集成的時候一定會有更好的融合性,前瞻性、兼容性!這也是為什么我們要學(xué)Spring Security的主要原因!
Spring Security因為它的復(fù)雜,所以從功能的豐富性的角度更勝一籌。其中比較典型的如:
Spring Security 默認(rèn)含有對OAuth2.0的支持,與Spring Social一起使用完成社交媒體登錄也比較方便,shiro 則需要自己手動實現(xiàn),而且 spring security 的權(quán)限細(xì)粒度更高,除了不能脫離Spring,shiro的功能它都有。而且Spring Security對OpenID也有支持,Shiro則需要自己手動寫代碼實現(xiàn)。
Spring Security是一個功能強(qiáng)大且高度可定制的身份驗證和訪問控制框架。它是用于保護(hù)基于Spring的應(yīng)用程序的實際標(biāo)準(zhǔn)。Spring Security致力于為Java應(yīng)用程序提供身份驗證和授權(quán)。與所有Spring項目一樣,Spring Security的真正強(qiáng)大之處在于可以輕松擴(kuò)展以滿足自定義要求
Spring Security在網(wǎng)絡(luò)安全的方面下的功夫更多,如 會話固定攻擊 和 CSRF 攻擊 等等,spring security 做了大量防御機(jī)制,這是shiro所不具備的。
四、總結(jié)
目前在java web應(yīng)用安全框架中,使用Apache Shiro的人較多,因為它相當(dāng)簡單,對比Spring Security,可能沒有Spring Security做的功能強(qiáng)大,但是在實際工作時可能并不需要那么復(fù)雜的東西,所以使用小而簡單的Shiro就足夠了。對于它倆到底哪個好,這個不必糾結(jié),能更簡單的解決項目問題就好了。
與shiro形成直接競爭的就是spring Security,二者在核心功能上幾乎差不多,但從使用的角度各有優(yōu)缺點(diǎn)。
我認(rèn)為:沒有最好的,只有最合適的。
ing Security,可能沒有Spring Security做的功能強(qiáng)大,但是在實際工作時可能并不需要那么復(fù)雜的東西,所以使用小而簡單的Shiro就足夠了。
對于它倆到底哪個好,這個不必糾結(jié),能更簡單的解決項目問題就好了。
與shiro形成直接競爭的就是spring Security,二者在核心功能上幾乎差不多,但從使用的角度各有優(yōu)缺點(diǎn)。
我認(rèn)為:沒有最好的,只有最合適的。
如果你只是想實現(xiàn)一個簡單的web應(yīng)用,shiro更加的輕量級,學(xué)習(xí)成本也更低。
如果您正在開發(fā)一個分布式的、微服務(wù)的、或者與Spring Cloud系列框架深度集成的項目,還是建議您使用Spring Security。
到此這篇關(guān)于Java中security與shiro的區(qū)別詳解的文章就介紹到這了,更多相關(guān)security與shiro的區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文詳解Spring中的HttpMessageNotReadableException異常處理
這篇文章主要為大家詳細(xì)介紹了Spring中的HttpMessageNotReadableException異常,分析其產(chǎn)生的原因并通過實際代碼示例展示如何有效地捕獲和處理這一異常,感興趣的可以了解下2025-02-02看動畫學(xué)算法之Java實現(xiàn)doublyLinkedList
這篇文章主要介紹Java實現(xiàn)doublyLinkedList,LinkedList:doublyLinkedList相對比較復(fù)雜,今天就來簡單學(xué)習(xí)一下doublyLinkedList的基本操作和概,感興趣的小伙伴可以參考下面具體文章內(nèi)容2021-10-10IDEA實現(xiàn)Maven項目創(chuàng)建并連接Tomcat方式
Maven是一款由Apache開發(fā)的項目管理工具,主要用于Java項目的構(gòu)建和依賴管理,它通過pom.xml文件自動管理項目依賴的jar包,簡化了項目構(gòu)建過程,Maven支持項目從編寫源代碼到編譯、測試、打包、部署的全過程管理,其依賴管理功能免去了手動添加jar包的麻煩2024-10-10