Shiro簡介以及與Spring集成Demo

一:Shiro工作流程

1.指定配置文件,配置文件中指定authenticator(認證)類型。初始化生成securityManager,初始化securityManager中的authenticator(認證)和realms(源)。securityManager存儲爲全局變量。
2.創建或獲取subject(用於代表當前用戶的實體),線程私有變量,存儲於threadlocal上。
3.subject調用login(UsernamePasswordToken)方法,用於模擬用戶登錄,UsernamePasswordToken代表用戶名和密碼的抽象。
4.委派給securityManager處理。
5.securityManager委派給初始化時指定的authenticator(認證)處理。
6.authenticator循環realms,調用realm中的doGetAuthenticationInfo(用於身份驗證)進行身份認證。可繼承realm,
重寫doGetAuthenticationInfo方法,在其中編寫身份認證的業務邏輯。驗證失敗需拋異常。
7.若需判斷用戶的角色或權限,調用subject(代表當前用戶的實體)的hasroles等方法。
8.委派給securityManager處理。
9.securityManager委派給Authorizator(授權)處理。
10.Authorizator調用realm的doGetAuthorizationInfo方法獲取角色和權限,用於比較。

二、Shiro簡介

Apache Shiro是Java的一個安全框架。功能強大,使用簡單的Java安全框架,它爲開發人員提供一個直觀而全面的認證,授權,加密及會話管理的解決方案。

實際上,Shiro的主要功能是管理應用程序中與安全相關的全部,同時儘可能支持多種實現方法。Shiro是建立在完善的接口驅動設計和麪向對象原則之上的,支持各種自定義行爲。Shiro提供的默認實現,使其能完成與其他安全框架同樣的功能,這不也是我們一直努力想要得到的嗎!

Apache Shiro相當簡單,對比Spring Security,可能沒有Spring Security做的功能強大,但是在實際工作時可能並不需要那麼複雜的東西,所以使用小而簡單的Shiro就足夠了。對於它倆到底哪個好,這個不必糾結,能更簡單的解決項目問題就好了。

三、Shiro可以做什麼

● 驗證用戶身份
● 用戶訪問控制,比如用戶是否被賦予了某個角色;是否允許訪問某些資源
● 在任何環境都可以使用Session API,即使不是WEB項目或沒有EJB容器
● 事件響應(在身份驗證,訪問控制期間,或是session生命週期中)
● 集成多種用戶信息數據源
● SSO-單點登陸
● Remember Me,記住我
● Shiro嘗試在任何應用環境下實現這些功能,而不依賴其他框架、容器或應用服務器。

四、主要架構閱覽
在這裏插入圖片描述
Subject:主體,既可以代表用戶,也可以代表程序(網絡爬蟲等),它需要訪問系統,系統則需要對其進行認證和授權,可以看到主體可以是任何可以與應用交互的“用戶”。

SecurityManager: 安全管理,用戶請求Url,對應於一個Subject對象,由SecurityManager統一對Subject進行認證和授權(父)。

Authenricator: 認證器,主要對Subject進行認證,Subject的信息在shrio中是通過AuthenticationToken對象來儲存,由AuthenricationStrategy進行驗證管理.(子)。如果用戶覺得Shiro默認的不好,可以自定義實現;其需要認證策略(Authentication Strategy),即什麼情況下算用戶認證通過了;

Authorizer:授權器,Subject認證後,由它來對其授予對應角色權限.(子)即控制着用戶能訪問應用中的哪些功能;

SessionManager: Shiro的session管理方式,Shiro提供了一個專門管理session的方式,通常的web程序中的session是HttpSession的對象,是由web容器來管理的.如果寫過Servlet就應該知道Session的概念,Session呢需要有人去管理它的生命週期,這個組件就是SessionManager;而Shiro並不僅僅可以用在Web環境,也可以用在如普通的JavaSE環境、EJB等環境;所有呢,Shiro就抽象了一個自己的Session來管理主體與應用之間交互的數據;這樣的話,比如我們在Web環境用,剛開始是一臺Web服務器;接着又上了臺EJB服務器;這時想把兩臺服務器的會話數據放到一個地方,這個時候就可以實現自己的分佈式會話(如把數據放到Memcached服務器);

SessionDao: session的接口,Shiro通過它來管理session數據,個性化的session數據儲存需要使用sessionDao.

CacheManager: 緩存控制器,主要對session數據和授權數據進行緩存,減小數據庫的訪問壓力.可以通過和ehcache的整合對緩存數據進行管理.

Pluggable Realms: 可擴展領域,相當於數據源,我們通過上面內容可以大致瞭解到Shiro的工作原理,但Shiro是怎樣得知Subject的信息和數據庫的信息是否匹配呢?Shiro這裏就提供了一個realms的概念,它的作用就是得到數據庫中的信息.這個realm是可以多個並且可以自定義,只需繼承AuthorizingRealm這個接口就可以了.可以有1個或多個Realm,可以認爲是安全實體數據源,即用於獲取安全實體的;可以是JDBC實現,也可以是LDAP實現,或者內存實現等等,由用戶提供,Shiro不知道你的用戶/權限存儲在哪及以何種格式存儲,所以我們一般在應用中都需要實現自己的Realm密碼模塊

注意:對Subject進行認證和授權都需要調用realm,所以realm不僅僅相當於數據源,更加包含了認證和授權的一種邏輯.

Cryptography: 密碼模塊,一個密碼管理工具,提供了一套加密/解密的組件.比如常用的散列,加/解密等功能,日常練習所使用的md5算法其實是一種散列算法,只能加密,不能解密.

五、Shiro認證流程

Shiro處理一個Subject流程圖
在這裏插入圖片描述
可以看到:應用代碼直接交互的對象是Subject,也就是說Shiro的對外API核心就是Subject;其每個API的含義:

Subject主體,代表了當前“用戶”,這個用戶不一定是一個具體的人,與當前應用交互的任何東西都是Subject,如網絡爬蟲,機器人等;即一個抽象概念;所有Subject都綁定到SecurityManager,與Subject的所有交互都會委託給SecurityManager;可以把Subject認爲是一個門面;SecurityManager纔是實際的執行者;

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

Realm:域,Shiro從Realm獲取安全數據(如用戶、角色、權限),就是說SecurityManager要驗證用戶身份,那麼它需要從Realm獲取相應的用戶進行比較以確定用戶身份是否合法;也需要從Realm得到用戶相應的角色/權限進行驗證用戶是否能進行操作;可以把Realm看成DataSource,即安全數據源。

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

1、應用代碼通過Subject來進行認證和授權,而Subject又委託給SecurityManager;

2、我們需要給Shiro的SecurityManager注入Realm,從而讓SecurityManager能得到合法的用戶及其權限進行判斷。

從以上也可以看出,Shiro不提供維護用戶/權限,而是通過Realm讓開發人員自己注入。

將shiro與spring進行簡單的整合,需要以下步驟:

1.配置web.xml的filter
2.在spring裏配置filter
3.在spring裏配置SecurityManager
4.在spring裏配置Realm

Demo地址如下:
SpringShiroDemo

參考鏈接如下:
https://blog.csdn.net/u011781521/article/details/55094751
https://blog.csdn.net/pyfysf/article/details/81952889

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章