Java框架之Shiro

Apache Shiro是Java的一個安全框架娘香。目前继阻,使用Apache Shiro的人越來越多露筒,因為它相當簡單呐伞,對比Spring Security,可能沒有Spring Security做的功能強大慎式,但是在實際工作時可能并不需要那么復雜的東西伶氢,所以使用小而簡單的Shiro就足夠了。對于它倆到底哪個好瘪吏,這個不必糾結(jié)癣防,能更簡單的解決項目問題就好了。

Shiro可以非常容易的開發(fā)出足夠好的應用掌眠,其不僅可以用在JavaSE環(huán)境蕾盯,也可以用在JavaEE環(huán)境。Shiro可以幫助我們完成:認證蓝丙、授權(quán)级遭、加密、會話管理渺尘、與Web集成挫鸽、緩存等。這不就是我們想要的嘛鸥跟,而且Shiro的API也是非常簡單丢郊;其基本功能點如下圖所示:

Authentication:身份認證/登錄,驗證用戶是不是擁有相應的身份医咨;

Authorization:授權(quán)枫匾,即權(quán)限驗證,驗證某個已認證的用戶是否擁有某個權(quán)限拟淮;即判斷用戶是否能做事情干茉,常見的如:驗證某個用戶是否擁有某個角色〕颓福或者細粒度的驗證某個用戶對某個資源是否具有某個權(quán)限等脂;

Session Manager:會話管理,即用戶登錄后就是一次會話撑蚌,在沒有退出之前上遥,它的所有信息都在會話中;會話可以是普通JavaSE環(huán)境的争涌,也可以是如Web環(huán)境的粉楚;

Cryptography:加密,保護數(shù)據(jù)的安全性,如密碼加密存儲到數(shù)據(jù)庫模软,而不是明文存儲伟骨;

Web Support:Web支持,可以非常容易的集成到Web環(huán)境燃异;

Caching:緩存携狭,比如用戶登錄后,其用戶信息回俐、擁有的角色/權(quán)限不必每次去查逛腿,這樣可以提高效率;

Concurrency:shiro支持多線程應用的并發(fā)驗證仅颇,即如在一個線程中開啟另一個線程单默,能把權(quán)限自動傳播過去;

Testing:提供測試支持忘瓦;

Run As:允許一個用戶假裝為另一個用戶(如果他們允許)的身份進行訪問搁廓;

Remember Me:記住我,這個是非常常見的功能耕皮,即一次登錄后境蜕,下次再來的話不用登錄了。

記住一點明场,Shiro不會去維護用戶汽摹、維護權(quán)限;這些需要我們自己去設計/提供苦锨;然后通過相應的接口注入給Shiro即可逼泣。

接下來我們分別從外部和內(nèi)部來看看Shiro的架構(gòu),對于一個好的框架舟舒,從外部來看應該具有非常簡單易于使用的API拉庶,且API契約明確;從內(nèi)部來看的話秃励,其應該有一個可擴展的架構(gòu)氏仗,即非常容易插入用戶自定義實現(xiàn),因為任何框架都不能滿足所有需求夺鲜。

首先皆尔,我們從外部來看Shiro吧,即從應用程序角度的來觀察如何使用Shiro完成工作币励。如下圖:

可以看到:應用代碼直接交互的對象是Subject慷蠕,也就是說Shiro的對外API核心就是Subject;其每個API的含義:

Subject:主體食呻,代表了當前“用戶”流炕,這個用戶不一定是一個具體的人澎现,與當前應用交互的任何東西都是Subject,如網(wǎng)絡爬蟲每辟,機器人等剑辫;即一個抽象概念;所有Subject都綁定到SecurityManager渠欺,與Subject的所有交互都會委托給SecurityManager妹蔽;可以把Subject認為是一個門面;SecurityManager才是實際的執(zhí)行者峻堰;

SecurityManager:安全管理器讹开;即所有與安全有關的操作都會與SecurityManager交互盅视;且它管理著所有Subject捐名;可以看出它是Shiro的核心,它負責與后邊介紹的其他組件進行交互闹击,如果學習過SpringMVC镶蹋,你可以把它看成DispatcherServlet前端控制器;

Realm:域赏半,Shiro從從Realm獲取安全數(shù)據(jù)(如用戶贺归、角色、權(quán)限)断箫,就是說SecurityManager要驗證用戶身份拂酣,那么它需要從Realm獲取相應的用戶進行比較以確定用戶身份是否合法;也需要從Realm得到用戶相應的角色/權(quán)限進行驗證用戶是否能進行操作仲义;可以把Realm看成DataSource婶熬,即安全數(shù)據(jù)源。

也就是說對于我們而言埃撵,最簡單的一個Shiro應用:

1赵颅、應用代碼通過Subject來進行認證和授權(quán),而Subject又委托給SecurityManager暂刘;

2饺谬、我們需要給Shiro的SecurityManager注入Realm,從而讓SecurityManager能得到合法的用戶及其權(quán)限進行判斷谣拣。

從以上也可以看出募寨,Shiro不提供維護用戶/權(quán)限,而是通過Realm讓開發(fā)人員自己注入森缠。

接下來我們來從Shiro內(nèi)部來看下Shiro的架構(gòu)拔鹰,如下圖所示:


Subject:主體,可以看到主體可以是任何可以與應用交互的“用戶”辅鲸;

SecurityManager:相當于SpringMVC中的DispatcherServlet或者Struts2中的FilterDispatcher格郁;是Shiro的心臟;所有具體的交互都通過SecurityManager進行控制;它管理著所有Subject例书、且負責進行認證和授權(quán)锣尉、及會話、緩存的管理决采。

Authenticator:認證器自沧,負責主體認證的,這是一個擴展點树瞭,如果用戶覺得Shiro默認的不好拇厢,可以自定義實現(xiàn);其需要認證策略(Authentication Strategy)晒喷,即什么情況下算用戶認證通過了孝偎;

Authrizer:授權(quán)器,或者訪問控制器凉敲,用來決定主體是否有權(quán)限進行相應的操作衣盾;即控制著用戶能訪問應用中的哪些功能;

Realm:可以有1個或多個Realm爷抓,可以認為是安全實體數(shù)據(jù)源势决,即用于獲取安全實體的;可以是JDBC實現(xiàn)蓝撇,也可以是LDAP實現(xiàn)果复,或者內(nèi)存實現(xiàn)等等;由用戶提供渤昌;注意:Shiro不知道你的用戶/權(quán)限存儲在哪及以何種格式存儲虽抄;所以我們一般在應用中都需要實現(xiàn)自己的Realm;

SessionManager:如果寫過Servlet就應該知道Session的概念耘沼,Session呢需要有人去管理它的生命周期极颓,這個組件就是SessionManager;而Shiro并不僅僅可以用在Web環(huán)境群嗤,也可以用在如普通的JavaSE環(huán)境菠隆、EJB等環(huán)境;所有呢狂秘,Shiro就抽象了一個自己的Session來管理主體與應用之間交互的數(shù)據(jù)骇径;這樣的話,比如我們在Web環(huán)境用者春,剛開始是一臺Web服務器破衔;接著又上了臺EJB服務器;這時想把兩臺服務器的會話數(shù)據(jù)放到一個地方钱烟,這個時候就可以實現(xiàn)自己的分布式會話(如把數(shù)據(jù)放到Memcached服務器)晰筛;

SessionDAO:DAO大家都用過嫡丙,數(shù)據(jù)訪問對象,用于會話的CRUD读第,比如我們想把Session保存到數(shù)據(jù)庫曙博,那么可以實現(xiàn)自己的SessionDAO,通過如JDBC寫到數(shù)據(jù)庫怜瞒;比如想把Session放到Memcached中父泳,可以實現(xiàn)自己的Memcached SessionDAO;另外SessionDAO中可以使用Cache進行緩存吴汪,以提高性能惠窄;

CacheManager:緩存控制器,來管理如用戶漾橙、角色杆融、權(quán)限等的緩存的;因為這些數(shù)據(jù)基本上很少去改變近刘,放到緩存中后可以提高訪問的性能

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末擒贸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子觉渴,更是在濱河造成了極大的恐慌,老刑警劉巖徽惋,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件案淋,死亡現(xiàn)場離奇詭異,居然都是意外死亡险绘,警方通過查閱死者的電腦和手機踢京,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宦棺,“玉大人瓣距,你說我怎么就攤上這事〈蹋” “怎么了蹈丸?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呐芥。 經(jīng)常有香客問我逻杖,道長,這世上最難降的妖魔是什么思瘟? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任荸百,我火速辦了婚禮,結(jié)果婚禮上滨攻,老公的妹妹穿的比我還像新娘够话。我一直安慰自己蓝翰,他們只是感情好,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布女嘲。 她就那樣靜靜地躺著霎箍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪澡为。 梳的紋絲不亂的頭發(fā)上漂坏,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音媒至,去河邊找鬼顶别。 笑死,一個胖子當著我的面吹牛拒啰,可吹牛的內(nèi)容都是我干的驯绎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼谋旦,長吁一口氣:“原來是場噩夢啊……” “哼剩失!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起册着,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拴孤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后甲捏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體演熟,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年司顿,在試婚紗的時候發(fā)現(xiàn)自己被綠了芒粹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡大溜,死狀恐怖化漆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钦奋,我是刑警寧澤座云,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站锨苏,受9級特大地震影響疙教,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伞租,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一贞谓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧葵诈,春花似錦裸弦、人聲如沸祟同。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晕城。三九已至,卻和暖如春窖贤,著一層夾襖步出監(jiān)牢的瞬間砖顷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工赃梧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留滤蝠,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓授嘀,卻偏偏與公主長得像物咳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蹄皱,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

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

  • 構(gòu)建一個互聯(lián)網(wǎng)應用览闰,權(quán)限校驗管理是很重要的安全措施,這其中主要包含: 認證 - 用戶身份識別巷折,即登錄 授權(quán) - 訪...
    zhuke閱讀 3,505評論 0 30
  • 前言 Spring boot 是什么压鉴,網(wǎng)上的很多介紹,這里博客就不多介紹了盔几。如果不明白Spring boot是什么...
    xuezhijian閱讀 17,911評論 13 39
  • 1.簡介 Apache Shiro是Java的一個安全框架晴弃。功能強大,使用簡單的Java安全框架逊拍,它為開發(fā)人員提供...
    H_Man閱讀 3,171評論 4 48
  • Shiro(代碼) 1.1 簡介 Apache Shiro是Java的一個安全框架。目前际邻,使用Apache Shi...
    ZZS_簡閱讀 489評論 0 0
  • 文章轉(zhuǎn)載自:http://blog.csdn.net/w1196726224/article/details/53...
    wangzaiplus閱讀 3,397評論 0 3