二鳍刷、了解shiro架構(gòu) (10 Minute Tutorial on Apache Shiro)

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

image
image.gif

?

主要部分:

  1. Authentication:身份認(rèn)證/登錄,驗(yàn)證用戶是不是擁有相應(yīng)的身份罩润。

  2. 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)限弥雹。

  3. Session Manager:會(huì)話管理,即用戶登錄后就是一次會(huì)話延届,在沒(méi)有退出之前剪勿,它的所有信息都在會(huì)話中;會(huì)話可以是普通 JavaSE 環(huán)境的方庭,也可以是如 Web 環(huán)境的厕吉。

  4. Cryptography:加密,保護(hù)數(shù)據(jù)的安全性械念,如密碼加密存儲(chǔ)到數(shù)據(jù)庫(kù)头朱,而不是明文存儲(chǔ)。

支持:

  1. Web Support:Web支持龄减,可以非常容易的集成到 web 環(huán)境项钮。

  2. Caching:緩存,比如用戶登錄后希停,其用戶信息烁巫、擁有的角色/權(quán)限不必每次去查,這樣可以提高效率宠能。

  3. Concurrency:shiro 支持多線程應(yīng)用的并發(fā)驗(yàn)證亚隙,即如在一個(gè)線程中開(kāi)啟另一個(gè)線程,能把權(quán)限自動(dòng)傳播過(guò)去棍潘。

  4. Testing:提供測(cè)試支持恃鞋。

  5. Run As:允許一個(gè)用戶假裝為另一個(gè)用戶(如果他們?cè)试S)的身份進(jìn)行訪問(wèn)崖媚。

  6. Remember Me:記住我,這個(gè)是非常常見(jiàn)的功能恤浪,即一次登錄后畅哑,下次再來(lái)的話不用登錄了。

2水由,頂級(jí)概述 : https://shiro.apache.org/architecture.html

image
image.gif

?

  1. 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í)行者钞钙。

  2. SecurityManager:安全管理器。即所有與安全有關(guān)的操作都會(huì)與 SecurityManager 交互声离,且它管理著所有 Subject芒炼。可以看出它是 Shiro 的核心术徊,它負(fù)責(zé)其他組件進(jìn)行交互本刽。

  3. 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)

image
image.gif

?

  1. Subject (org.apache.shiro.subject.Subject):

主體株憾,可以看到主體可以是任何與應(yīng)用交互的“用戶”蝙寨。

  1. SecurityManager (org.apache.shiro.mgt.SecurityManager):

它是 Shiro 的核心,所有具體的交互都通過(guò) SecurityManager 進(jìn)行控制嗤瞎。它管理著所有 Subject墙歪、且負(fù)責(zé)進(jìn)行認(rèn)證和授權(quán)、及會(huì)話贝奇、緩存的管理虹菲。

  1. 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)用中的哪些功能。

  1. 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)等。

  1. SessionManager (org.apache.shiro.session.mgt.SessionManager):

如果寫過(guò) Servlet 就應(yīng)該知道 Session 的概念枣购,Session 需要有人去管理它的生命周期嬉探,這個(gè)組件就是 SessionManager。而 Shiro 并不僅僅可以用在 Web 環(huán)境棉圈,也可以用在如普通的 JavaSE 環(huán)境。

  1. 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)行緩存汽纤,以提高性能上岗。

  1. CacheManager (org.apache.shiro.cache.CacheManager):

緩存管理器。它來(lái)管理如用戶蕴坪、角色肴掷、權(quán)限等的緩存的。因?yàn)檫@些數(shù)據(jù)基本上很少去改變背传,放到緩存中后可以提高訪問(wèn)的性能呆瞻。

  1. 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

image
image.gif

?

  1. 應(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

image
image.gif

?

  1. 在應(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。

image
image.gif

?

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

image
image.gif

?

推薦文章

https://blog.csdn.net/u012437781/article/details/78490903

https://blog.csdn.net/b609355187/article/details/80664273

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市峭沦,隨后出現(xiàn)的幾起案子贾虽,更是在濱河造成了極大的恐慌,老刑警劉巖吼鱼,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蓬豁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡菇肃,警方通過(guò)查閱死者的電腦和手機(jī)地粪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)琐谤,“玉大人蟆技,你說(shuō)我怎么就攤上這事《芳桑” “怎么了质礼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)织阳。 經(jīng)常有香客問(wèn)我眶蕉,道長(zhǎng),這世上最難降的妖魔是什么唧躲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任妻坝,我火速辦了婚禮,結(jié)果婚禮上惊窖,老公的妹妹穿的比我還像新娘。我一直安慰自己厘贼,他們只是感情好界酒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著嘴秸,像睡著了一般毁欣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岳掐,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天凭疮,我揣著相機(jī)與錄音,去河邊找鬼串述。 笑死执解,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纲酗。 我是一名探鬼主播衰腌,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼新蟆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了右蕊?” 一聲冷哼從身側(cè)響起琼稻,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饶囚,沒(méi)想到半個(gè)月后帕翻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萝风,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年嘀掸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闹丐。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡横殴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卿拴,到底是詐尸還是另有隱情衫仑,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布堕花,位于F島的核電站文狱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏缘挽。R本人自食惡果不足惜瞄崇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壕曼。 院中可真熱鬧苏研,春花似錦、人聲如沸腮郊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)轧飞。三九已至衅鹿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間过咬,已是汗流浹背大渤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掸绞,地道東北人泵三。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親切黔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子砸脊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 目錄 Apache Shiro架構(gòu)詳解... 1 1、高層視圖... 2 2纬霞、詳細(xì)架構(gòu)... 4 3凌埂、Shrio設(shè)...
    塵_竹閱讀 3,309評(píng)論 0 4
  • 文章轉(zhuǎn)載自:http://blog.csdn.net/w1196726224/article/details/53...
    wangzaiplus閱讀 3,397評(píng)論 0 3
  • 一 、Shiro入門 1.簡(jiǎn)介 Apache Shiro 是 Java 的一個(gè)安全(權(quán)限)框架诗芜。 Shiro 可以...
    TiaNa_na閱讀 1,099評(píng)論 0 8
  • 1配置文件瞳抓,(*.ini,*,xml ,或者配置類)后面細(xì)講 一,登陸伏恐,登出過(guò)程 1孩哑,根據(jù)配置文件,生成Secur...
    song_a27e閱讀 443評(píng)論 0 0
  • 今天是廣州開(kāi)演講俱樂(lè)部第20期線上演講比賽翠桦, 非常榮幸能夠作為主持人參加了這次比賽横蜒。特別感謝power演講俱樂(lè)部雨...
    米粒兒暖陽(yáng)閱讀 344評(píng)論 1 3