10 Minute Tutorial on Apache Shiro
教程:https://shiro.apache.org/10-minute-tutorial.html#overview
文檔:https://shiro.apache.org/reference.html
shiro: https://github.com/apache/shiro/blob/master/samples/quickstart/src/main/java/Quickstart.java
1蛾方,架構(gòu)層: https://shiro.apache.org/introduction.html
?
主要部分:
Authentication:身份認(rèn)證/登錄,驗(yàn)證用戶是不是擁有相應(yīng)的身份罩润。
Authorization:授權(quán)赫舒,即權(quán)限驗(yàn)證,驗(yàn)證某個(gè)已認(rèn)證的用戶是否擁有某個(gè)權(quán)限唐全;即判斷用戶是否能做事情埃跷,常見(jiàn)的如:驗(yàn)證某個(gè)用戶是否擁有某個(gè)角色∮世或者細(xì)粒度的驗(yàn)證某個(gè)用戶對(duì)某個(gè)資源是否具有某個(gè)權(quán)限弥雹。
Session Manager:會(huì)話管理,即用戶登錄后就是一次會(huì)話延届,在沒(méi)有退出之前剪勿,它的所有信息都在會(huì)話中;會(huì)話可以是普通 JavaSE 環(huán)境的方庭,也可以是如 Web 環(huán)境的厕吉。
Cryptography:加密,保護(hù)數(shù)據(jù)的安全性械念,如密碼加密存儲(chǔ)到數(shù)據(jù)庫(kù)头朱,而不是明文存儲(chǔ)。
支持:
Web Support:Web支持龄减,可以非常容易的集成到 web 環(huán)境项钮。
Caching:緩存,比如用戶登錄后希停,其用戶信息烁巫、擁有的角色/權(quán)限不必每次去查,這樣可以提高效率宠能。
Concurrency:shiro 支持多線程應(yīng)用的并發(fā)驗(yàn)證亚隙,即如在一個(gè)線程中開(kāi)啟另一個(gè)線程,能把權(quán)限自動(dòng)傳播過(guò)去棍潘。
Testing:提供測(cè)試支持恃鞋。
Run As:允許一個(gè)用戶假裝為另一個(gè)用戶(如果他們?cè)试S)的身份進(jìn)行訪問(wèn)崖媚。
Remember Me:記住我,這個(gè)是非常常見(jiàn)的功能恤浪,即一次登錄后畅哑,下次再來(lái)的話不用登錄了。
2水由,頂級(jí)概述 : https://shiro.apache.org/architecture.html
?
Subject:主體荠呐,代表了當(dāng)前“用戶”。這個(gè)用戶不一定是一個(gè)具體的人砂客,與當(dāng)前應(yīng)用交互的任何東西都是 Subject泥张,如網(wǎng)絡(luò)爬蟲(chóng),機(jī)器人等鞠值。所有 Subject 都綁定到 SecurityManager媚创,與 Subject 的所有交互都會(huì)委托給 SecurityManager。我們可以把 Subject 認(rèn)為是一個(gè)門面彤恶,SecurityManager 才是實(shí)際的執(zhí)行者钞钙。
SecurityManager:安全管理器。即所有與安全有關(guān)的操作都會(huì)與 SecurityManager 交互声离,且它管理著所有 Subject芒炼。可以看出它是 Shiro 的核心术徊,它負(fù)責(zé)其他組件進(jìn)行交互本刽。
Realm:Shiro 從 Realm 獲取安全數(shù)據(jù)(如用戶、角色赠涮、權(quán)限)子寓,就是說(shuō) SecurityManager 要驗(yàn)證用戶身份,那么它需要從 Realm 獲取相應(yīng)的用戶進(jìn)行比較以確定用戶身份是否合法世囊,也需要從 Realm 得到用戶相應(yīng)的角色/權(quán)限進(jìn)行驗(yàn)證用戶是否能進(jìn)行操作别瞭。 可以配置多個(gè)但最少得有一個(gè)
3,詳細(xì)結(jié)構(gòu)
?
- Subject (org.apache.shiro.subject.Subject):
主體株憾,可以看到主體可以是任何與應(yīng)用交互的“用戶”蝙寨。
- SecurityManager (org.apache.shiro.mgt.SecurityManager):
它是 Shiro 的核心,所有具體的交互都通過(guò) SecurityManager 進(jìn)行控制嗤瞎。它管理著所有 Subject墙歪、且負(fù)責(zé)進(jìn)行認(rèn)證和授權(quán)、及會(huì)話贝奇、緩存的管理虹菲。
- Authenticator (org.apache.shiro.authc.Authenticator):
認(rèn)證器,負(fù)責(zé)主體認(rèn)證的掉瞳,這是一個(gè)擴(kuò)展點(diǎn)毕源,如果用戶覺(jué)得 Shiro 默認(rèn)的不好浪漠,我們可以自定義實(shí)現(xiàn)。其需要認(rèn)證策略
(Authentication Strategy (org.apache.shiro.authc.pam.AuthenticationStrategy))霎褐,即什么情況下算用戶認(rèn)證通過(guò)了址愿。
4)Authorizer (org.apache.shiro.authz.Authorizer):
授權(quán)器,或者訪問(wèn)控制器冻璃。它用來(lái)決定主體是否有權(quán)限進(jìn)行相應(yīng)的操作响谓,即控制著用戶能訪問(wèn)應(yīng)用中的哪些功能。
- Realms (org.apache.shiro.realm.Realm):
可以有1個(gè)或多個(gè) Realm省艳,可以認(rèn)為是安全實(shí)體數(shù)據(jù)源娘纷,即用于獲取安全實(shí)體的。它可以是 JDBC 實(shí)現(xiàn)跋炕,也可以是 LDAP 實(shí)現(xiàn)赖晶,或者內(nèi)存實(shí)現(xiàn)等。
- SessionManager (org.apache.shiro.session.mgt.SessionManager):
如果寫過(guò) Servlet 就應(yīng)該知道 Session 的概念枣购,Session 需要有人去管理它的生命周期嬉探,這個(gè)組件就是 SessionManager。而 Shiro 并不僅僅可以用在 Web 環(huán)境棉圈,也可以用在如普通的 JavaSE 環(huán)境。
- SessionDAO (org.apache.shiro.session.mgt.eis.SessionDAO):
DAO 大家都用過(guò)眷蜓,數(shù)據(jù)訪問(wèn)對(duì)象分瘾,用于會(huì)話的 CRUD。我們可以自定義 SessionDAO 的實(shí)現(xiàn)吁系,控制 session 存儲(chǔ)的位置德召。如通過(guò) JDBC 寫到數(shù)據(jù)庫(kù)或通過(guò) jedis 寫入 redis 中。另外 SessionDAO 中可以使用 Cache 進(jìn)行緩存汽纤,以提高性能上岗。
- CacheManager (org.apache.shiro.cache.CacheManager):
緩存管理器。它來(lái)管理如用戶蕴坪、角色肴掷、權(quán)限等的緩存的。因?yàn)檫@些數(shù)據(jù)基本上很少去改變背传,放到緩存中后可以提高訪問(wèn)的性能呆瞻。
- Cryptography (org.apache.shiro.crypto.*):
密碼模塊,Shiro 提高了一些常見(jiàn)的加密組件用于如密碼加密/解密的径玖。
3.Authenticator 認(rèn)證 : https://shiro.apache.org/authentication.html
Authentication Sequence https://shiro.apache.org/authentication.html#authentication-sequence
?
- 應(yīng)用程序代碼用Subject.login(token)登錄方法,通過(guò)構(gòu)造AuthenticationToken實(shí)例代表最終用戶的主體和憑證痴脾。
2)將Subject實(shí)例委托給應(yīng)用程序的SecurityManager(Shiro的安全管理)通過(guò)調(diào)用securityManager.login(token)來(lái)開(kāi)始實(shí)際的認(rèn)證工作。這里開(kāi)始真正的認(rèn)證工作了
3)SecurityManager得到token信息后梳星,通過(guò)調(diào)用authenticator.authenticate(token)方法赞赖,把身份驗(yàn)證委托給內(nèi)置的Authenticator的實(shí)例進(jìn)行驗(yàn)證滚朵。authenticator通常是ModularRealmAuthenticator
實(shí)例,支持對(duì)一個(gè)或多個(gè)Realm實(shí)例進(jìn)行適配前域。ModularRealmAuthenticator提供了一種可插拔的認(rèn)證風(fēng)格辕近,你可以在此處插入自定義Realm實(shí)現(xiàn)。
4)如果配置了多個(gè)Realm话侄,ModularRealmAuthenticator會(huì)根據(jù)配置的AuthenticationStrategy(身份驗(yàn)證策略)進(jìn)行多Realm認(rèn)證過(guò)程亏推。
注:如果應(yīng)用程序中僅配置了一個(gè)Realm,Realm將被直接調(diào)用而無(wú)需再配置認(rèn)證策略年堆。
我會(huì)在后邊介紹到身份驗(yàn)證策略
5)判斷每個(gè)Realm是否支持提交的token吞杭,如果支持Realm就會(huì)調(diào)用getAuthenticationInfo(token)方法進(jìn)行認(rèn)證處理。
4.授權(quán)****Authorization https://shiro.apache.org/authorization.html
Authorization has three core elements that we reference quite a bit in Shiro: permissions, roles, and users.
權(quán)限僅代表行為
Authorization Sequence https://shiro.apache.org/authorization.html#authorization-sequence
?
- 在應(yīng)用程序中調(diào)用授權(quán)驗(yàn)證方法
(Subject hasRole, checkRole, isPermitted,or checkPermission)
2)Subject的實(shí)例通常是DelegatingSubject類(或子類)的實(shí)例對(duì)象变丧,在認(rèn)證開(kāi)始時(shí)芽狗,會(huì)委托應(yīng)用程序設(shè)置的securityManager實(shí)例調(diào)用相應(yīng)的isPermitted或hasRole方法。
3)SecurityManager會(huì)委托內(nèi)置的Authorizer的實(shí)例(默認(rèn)是ModularRealmAuthorizer類的實(shí)例痒蓬,類似認(rèn)證實(shí)例童擎,它同樣支持一個(gè)或多個(gè)Realm實(shí)例認(rèn)證)調(diào)用相應(yīng)的授權(quán)方法。
4)每一個(gè)Realm將檢查是否實(shí)現(xiàn)了相同的 Authorizer 接口攻晒。然后顾复,將調(diào)用Reaml自己的相應(yīng)的授權(quán)驗(yàn)證方法。
5.ream https://shiro.apache.org/realm.html
Shiro 從從Realm獲取安全數(shù)據(jù)(如用戶鲁捏、角色芯砸、權(quán)限),就是說(shuō)SecurityManager要驗(yàn)證用戶身份给梅,那么它需要從Realm獲取相應(yīng)的用戶進(jìn)行比較以確定用戶身份是否合法假丧;也需要從Realm得到用戶相應(yīng)的角色/權(quán)限進(jìn)行驗(yàn)證用戶是否能進(jìn)行操作;可以把Realm看 成DataSource 动羽, 即安全數(shù)據(jù)源
最基礎(chǔ)的是Realm接口包帚,CachingRealm負(fù)責(zé)緩存處理,AuthenticationReal負(fù)責(zé)認(rèn)證运吓,AuthorizingRealm負(fù)責(zé)授權(quán)渴邦,通常自定義的realm繼承AuthorizingRealm。
?
Realm能做的工作主要有以下幾個(gè)方面:
- 驗(yàn)證是否能登錄羽德,并返回驗(yàn)證信息(getAuthenticationInfo方法)
AuthenticationInfo getAuthenticationInfo(AuthenticationToken token)
- 驗(yàn)證是否有訪問(wèn)指定資源的權(quán)限几莽,并返回所擁有的所有權(quán)限(getAuthorizationInfo方法)
AuthorizingRealm 中的 getAuthorizationInfo
- 判斷是否支持token(例如:HostAuthenticationToken,UsernamePasswordToken等)(supports方法) boolean supports(AuthenticationToken token)
String getName()
6.Session Management
https://shiro.apache.org/session-management.html
SessionManagement管理應(yīng)用中所有Subject的會(huì)話的創(chuàng)建宅静、維護(hù)章蚣、刪除、失效、驗(yàn)證等工作纤垂。與Shiro中的其他核心架構(gòu)組件一樣矾策,由頂層組件SecurityManager維護(hù)SessionManager
?
推薦文章