新聞中心
本文轉(zhuǎn)載自微信公眾號「程序新視界」,作者丑胖俠二師兄。轉(zhuǎn)載本文請聯(lián)系程序新視界公眾號。

成都創(chuàng)新互聯(lián)主要從事網(wǎng)頁設(shè)計、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機版網(wǎng)站建設(shè))、響應(yīng)式網(wǎng)站設(shè)計、程序開發(fā)、網(wǎng)站優(yōu)化、微網(wǎng)站、微信小程序定制開發(fā)等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的成都做網(wǎng)站、網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、網(wǎng)絡(luò)營銷經(jīng)驗,集策劃、開發(fā)、設(shè)計、營銷、管理等多方位專業(yè)化運作于一體。
在實踐中,發(fā)現(xiàn)很多朋友雖然在使用Shiro,但貌似對其并不了解,甚至有的項目還在使用filter來實現(xiàn)權(quán)限管理,而網(wǎng)絡(luò)上相關(guān)教程又比較古老。因此,決定為大家更新這么一個關(guān)于Shiro的系列教程,最后會整理成冊,分享給大家。
如果你也想深入學(xué)習(xí)一下Shiro框架,那么關(guān)注一下公眾號“程序新視界”,可及時獲取最新的文章,等本系列更新完畢會也會第一時間整理成電子版文檔分享給大家。第一篇,給大家科普一些基礎(chǔ)概念,下面開始正文。
前言
權(quán)限管理是每個系統(tǒng)不可缺少的,它隸屬于系統(tǒng)安全的范疇,實現(xiàn)對用戶訪問系統(tǒng)的控制,按照指定的安全策略控制用戶對資源的訪問。
權(quán)限管理通常包括用戶身份認(rèn)證和授權(quán)兩部分,簡稱認(rèn)證授權(quán)。對于需要訪問控制的資源,需先進(jìn)行用戶身份認(rèn)證,認(rèn)證通過后用戶具有該資源的訪問權(quán)限便可進(jìn)行訪問。
針對權(quán)限管理,在Java體系中,常見的權(quán)限框架有Shiro和Spring Security,當(dāng)然在一些簡單或古老的系統(tǒng)中可能還在用手寫的filter來進(jìn)行權(quán)限的管理和控制。本文先從Shiro的功能、組件、架構(gòu)等方面來帶大家了解一下Shiro框架。
Shiro簡介
Apache Shiro是一個強大且易用的Java安全框架,執(zhí)行身份驗證、授權(quán)、密碼和會話管理。與之相對應(yīng)的便是Spring Security,但在大多數(shù)項目中開發(fā)人員更愿意使用Shiro來管理權(quán)限。
主要原因是使用起來比較簡單,而Spring Security相對來說更重量級一些,學(xué)習(xí)曲線比較陡峭,而實際環(huán)境中也并不需要Spring Security那么多功能。所以,一般情況下,使用Shiro便足夠了。
Shiro可以快速、輕松的運用于任何應(yīng)用程序中,從最小的移動應(yīng)用程序到最大的網(wǎng)絡(luò)和企業(yè)應(yīng)用程序。
Shiro能做什么
Shiro提供了以下功能:認(rèn)證(Authentication)、授權(quán)(Authorization)、加密(Cryptography)、Session管理(Session Management)、Web集成(Web Support)、緩存(Caching)等。可用于保護(hù)任何應(yīng)用程序:從命令行應(yīng)用程序、移動應(yīng)用程序到最大的Web和企業(yè)應(yīng)用程序。
關(guān)于Shiro的核心功能,官方提供了下圖:
使用Shiro我們可以實現(xiàn)以下功能:
- 用戶認(rèn)證;
- 用戶訪問控制:判斷用戶是否擁有特定的角色;判斷用戶是否可執(zhí)行某個操作;
- 在任何環(huán)境下使用Session API,即使在Web或EJB容器之外的應(yīng)用;
- 可在認(rèn)證、訪問控制和會話期間,對事件做出響應(yīng);
- 匯總一個或多個用戶安全數(shù)據(jù)的數(shù)據(jù)源,并將其全部顯示為單個復(fù)合用戶“視圖”;
- 支持單點登錄(SSO)功能;
- 支持登錄時的“記住”功能;
- 其他應(yīng)用程序;
Shiro特點
Shiro的目標(biāo)是:在各類應(yīng)用(從命令行到大型企業(yè)應(yīng)用)中,做到不依賴其他三方框架、容器或應(yīng)用程序本身的依賴,可以在任何環(huá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;
- 不跟任何的框架或者容器捆綁,可以獨立運行;
Shiro各模塊功能
結(jié)合下圖,我們來細(xì)化一下Shiro各個模塊對應(yīng)的功能:
Authentication:身份認(rèn)證/登錄,驗證用戶是不是擁有相應(yīng)的身份;
Authorization:授權(quán),即權(quán)限驗證。驗證某個用戶是否有操作某個功能的權(quán)限。如:驗證用戶是否擁有某個角色、是否有操作某個資源的權(quán)限;
Session Management:Session管理,存儲用戶登錄信息于會話當(dāng)中,支持Web環(huán)境和非Web環(huán)境;
Cryptography:加密數(shù)據(jù),并保持易用性,比如密碼加密后存儲到數(shù)據(jù)庫;
Web Support:Web支持,可以方便的集成到Web環(huán)境;
Caching:緩存,比如用戶登錄后,對用戶信息、角色/權(quán)限進(jìn)行緩存;
Concurrency:Shiro支持多線程場景下的并發(fā)驗證,即如在一個線程中開啟另一個線程,能把權(quán)限自動傳播過去;
Testing:提供測試支持;
Run As:允許一個用戶假裝為另一個用戶(如果他們允許)進(jìn)行訪問;
Remember Me:記住我,登錄之后,下次可直接進(jìn)入系統(tǒng)。
看了上面的組件是不是突然覺得Shiro在實際應(yīng)用中被小看了?雖然Shiro為我們提供了這么多功能,但它并不會幫我們實現(xiàn)具體的用戶、權(quán)限等體系,關(guān)于用戶、角色、權(quán)限等需要自行設(shè)計,然后在Shiro中進(jìn)行處理即可。
核心組件
Shiro包括三大核心組件:Subject,SecurityManager和Realms。這三個組件的關(guān)系如下圖:
Subject:主體,即“當(dāng)前操作用戶”。在Shiro中Subject并不僅僅指人,是一個抽象概念,也可以是第三方進(jìn)程、后臺帳戶(Daemon Account)或其他類似事物(如爬蟲、機器人等)。也就是說它僅僅意味著“當(dāng)前跟軟件交互的東西”。所有Subject都綁定到SecurityManager上,SecurityManager才是實際的執(zhí)行者。
SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通過SecurityManager來管理內(nèi)部組件實例(包括所有的Subject),并通過它來提供安全管理的各種服務(wù)。類似SpringMVC中的DispatcherServlet的作用。
Realm:域,充當(dāng)了Shiro與應(yīng)用安全數(shù)據(jù)間的“橋梁”或者“連接器”。也就是說,當(dāng)對用戶執(zhí)行認(rèn)證(登錄)和授權(quán)(訪問控制)驗證時,Shiro會從應(yīng)用配置的Realm中查找用戶及其權(quán)限信息。從這個意義上講,Realm本質(zhì)上是一個安全相關(guān)的DAO:它封裝了數(shù)據(jù)源的連接細(xì)節(jié),在需要時將相關(guān)數(shù)據(jù)提供給Shiro。當(dāng)配置Shiro時,至少指定一個Realm,用于認(rèn)證和(或)授權(quán)。
Shiro內(nèi)置了可以連接大量安全數(shù)據(jù)源(又名目錄)的Realm,如LDAP、關(guān)系數(shù)據(jù)庫(JDBC)、類似INI的文本配置資源以及屬性文件等。如果默認(rèn)的Realm不能滿足需求,還可以自定義Realm實現(xiàn)。
Shiro架構(gòu)概覽
分析了上述組件,我們梳理一下Shiro使用的簡單場景:應(yīng)用程序通過Subject來進(jìn)行認(rèn)證和授權(quán),而Subject是委托給SecurityManager管理的。SecurityManager進(jìn)行認(rèn)證和授權(quán)又需要Authenticator和Realm的支持,因此需將Realm注入給SecurityManager。
那么,Shiro內(nèi)部的架構(gòu)又是如何呢?
上圖中,Subject、SecurityManager、Realm我們在前面已經(jīng)講到過了,這里再看看其他模塊:
Authenticator:認(rèn)證器,負(fù)責(zé)Subject的認(rèn)證,支持自定義實現(xiàn);需要認(rèn)證策略(Authentication Strategy),即認(rèn)證通過的條件。
Authrizer:授權(quán)器,或者訪問控制器,用來決定主體是否有權(quán)限進(jìn)行相應(yīng)的操作。
SessionManager:SessionManager用于管理Session的生命周期。Shiro可用在Web環(huán)境和非Web環(huán)境,所以Shiro就抽象出一個Session來管理主體與應(yīng)用之間交互的數(shù)據(jù),這樣就可以將不同應(yīng)用的Session進(jìn)行集中管理,從而實現(xiàn)分布式會話。
SessionDAO:如果想把Session存儲到數(shù)據(jù)庫或Memcached當(dāng)中,則可實現(xiàn)對應(yīng)的SessionDAO來實現(xiàn)會話的CRUD。SessionDAO中可以使用Cache進(jìn)行緩存,來提高性能;
CacheManager:緩存控制器,用來管理用戶、角色、權(quán)限等緩存。
Cryptography:密碼模塊,提供了常見的加解密組件。
了解了上述組件的功能,再回想一下在實踐中的應(yīng)用,是不是有點豁然開朗了?
小結(jié)
看到很多朋友在使用shiro時往往是在網(wǎng)上找到一段代碼,然后進(jìn)行簡單的修改便運用起來了,而各個組件之間什么關(guān)系,實現(xiàn)這個功能的原理是什么等信息卻沒有進(jìn)行深入探究。這樣即便實踐了很多項目,依舊無法提升自身的技能。本篇文章從shiro的功能、架構(gòu)、組件等方面進(jìn)行講解,經(jīng)過本篇文章的學(xué)習(xí),想必大家已經(jīng)掌握了使用Shiro的基本原理和概念,這也是為后續(xù)深入學(xué)習(xí)和實踐做好準(zhǔn)備了。
網(wǎng)頁題目:還在親手寫Filter進(jìn)行權(quán)限校驗?嘗試一下Shiro吧
瀏覽路徑:http://fisionsoft.com.cn/article/dhjespo.html


咨詢
建站咨詢
