天天看點

SpringBoot15:內建Shiro

Apache Shiro 是一個Java 的安全(權限)架構。

Shiro 可以非常容易的開發出足夠好的應用,其不僅可以用在JavaSE環境,也可以用在JavaEE環 境。

Shiro可以完成,認證,授權,加密,會話管理,Web內建,緩存等。

下載下傳位址:https://shiro.apache.org/index.html

SpringBoot15:內建Shiro
SpringBoot15:內建Shiro

Authentication:身份認證、登入,驗證使用者是不是擁有相應的身份;

Authorization:授權,即權限驗證,驗證某個已認證的使用者是否擁有某個權限,即判斷使用者能否 進行什麼操作,如:驗證某個使用者是否擁有某個角色,或者細粒度的驗證某個使用者對某個資源是否 具有某個權限!

Session Manager:會話管理,即使用者登入後就是第一次會話,在沒有退出之前,它的所有資訊都 在會話中;會話可以是普通的JavaSE環境,也可以是Web環境;

Cryptography:加密,保護資料的安全性,如密碼加密存儲到資料庫中,而不是明文存儲;

Web Support:Web支援,可以非常容易的內建到Web環境;

Caching:緩存,比如使用者登入後,其使用者資訊,擁有的角色、權限不必每次去查,這樣可以提高 效率

Concurrency:Shiro支援多線程應用的并發驗證,即,如在一個線程中開啟另一個線程,能把權限 自動的傳播過去

Testing:提供測試支援;

Run As:允許一個使用者假裝為另一個使用者(如果他們允許)的身份進行通路;

Remember Me:記住我,這個是非常常見的功能,即一次登入後,下次再來的話不用登入了

從外部來看Shiro,即從應用程式角度來觀察如何使用shiro完成工作:

SpringBoot15:內建Shiro

subject: 應用代碼直接互動的對象是Subject,也就是說Shiro的對外API核心就是Subject, Subject代表了目前的使用者,這個使用者不一定是一個具體的人,與目前應用互動的任何東西都是 Subject,如網絡爬蟲,機器人等,與Subject的所有互動都會委托給

SecurityManager;Subject其 實是一個門面,SecurityManageer 才是實際的執行者 SecurityManager:安全管理器,即所有與安全有關的操作都會與SercurityManager互動,并且它 管理着所有的Subject,可以看出它是Shiro的核心,它負責與Shiro的其他元件進行互動,它相當于 SpringMVC的DispatcherServlet的角色

Realm:Shiro從Realm擷取安全資料(如使用者,角色,權限),就是說SecurityManager 要驗證 使用者身份,那麼它需要從Realm 擷取相應的使用者進行比較,來确定使用者的身份是否合法;也需要從 Realm得到使用者相應的角色、權限,進行驗證使用者的操作是否能夠進行,可以把Realm看成 DataSource;

SpringBoot15:內建Shiro

Subject:任何可以與應用互動的 ‘使用者’;

Security Manager:相當于SpringMVC中的DispatcherServlet;是Shiro的心髒,所有具體的互動 都通過Security Manager進行控制,它管理者所有的Subject,且負責進行認證,授權,會話,及 緩存的管理。

Authenticator:負責Subject認證,是一個擴充點,可以自定義實作;可以使用認證政策 (Authentication Strategy),即什麼情況下算使用者認證通過了;

Authorizer:授權器,即通路控制器,用來決定主體是否有權限進行相應的操作;即控制着使用者能 通路應用中的那些功能;

Realm:可以有一個或者多個的realm,可以認為是安全實體資料源,即用于擷取安全實體的,可 以用JDBC實作,也可以是記憶體實作等等,由使用者提供;是以一般在應用中都需要實作自己的realm

SessionManager:管理Session生命周期的元件,而Shiro并不僅僅可以用在Web環境,也可以用 在普通的JavaSE環境中

CacheManager:緩存控制器,來管理如使用者,角色,權限等緩存的;因為這些資料基本上很少改 變,放到緩存中後可以提高通路的性能;

Cryptography:密碼子產品,Shiro 提高了一些常見的加密元件用于密碼加密,解密等

檢視官網文檔:http://shiro.apache.org/tutorial.html

官方的quickstart:https://github.com/apache/shiro/tree/master/samples/quickstart/

建立一個maven父工程:springboot-08-shiro,用于學習Shiro,删掉不必要的東西

建立一個普通的Maven子工程:hello-shiro

根據官方文檔,我們來導入Shiro的依賴

編寫Shiro配置

log4j.properties

shiro.ini

編寫我們的QuickStrat

測試運作一下,成功!

注意:shiro的預設日志jar包是<code>commons-logging</code>,我這邊使用的是log4j

導入了一堆包!

類的描述

建立SecurityManager的執行個體對象

擷取目前的Subject

session的操作

使用者認證功能

角色檢查

權限檢查,粗粒度

權限檢查,細粒度

登出操作

退出系統<code>System.exit(0);</code>

OK,一個簡單的Shiro程式體驗,我們就在官方的帶領下初步認識了!

搭建一個SpringBoot項目、選中web子產品即可!

導入Maven依賴 <code>thymeleaf</code>

編寫一個頁面 index.html <code>templates</code>

編寫controller進行通路測試

測試通路首頁!

回顧核心API:

Subject:使用者主體

SecurityManager:安全管理器

Realm:Shiro 連接配接資料

步驟:

導入Shiro 和 spring整合的依賴

編寫Shiro 配置類 <code>config包</code>

我們倒着來,先想辦法建立一個 <code>realm</code> 對象

我們需要自定義一個 realm 的類,用來編寫一些查詢的方法,或者認證與授權的邏輯

将這個類注冊到我們的Bean中!<code>ShiroConfig</code>

接下來我們該去建立 <code>DefaultWebSecurityManager</code> 了

接下來我們該去建立 <code>ShiroFilterFactoryBean</code> 了

最後上完整的配置:

編寫兩個頁面、在templates目錄下建立一個 user 目錄 <code>add.html</code> <code>update.html</code>

編寫跳轉到頁面的controller

在index頁面上,增加跳轉連結

測試頁面跳轉是否OK

準備添加Shiro的内置過濾器

再起啟動測試,通路連結進行測試!攔截OK!但是發現,點選後會跳轉到404頁面,這 個不是我們想要的效果,我們需要自己定義一個Login頁面!

我們編寫一個自己的Login頁面

編寫跳轉的controller

在shiro中配置一下! <code>ShiroFilterFactoryBean()</code>方法下面

再次測試,成功的跳轉到了我們指定的Login頁面!

優化一下代碼,我們這裡的攔截可以使用 通配符來操作

測試,完全OK!

編寫一個登入的controller

在前端修改對應的資訊輸出或者請求!

登入頁面增加一個 msg 提示:

給表單增加一個送出位址:

理論,假設我們送出了表單,他會經過我們剛才編寫的UserRealm,我們送出測試一下

SpringBoot15:內建Shiro

确實執行了我們的認證邏輯!

在 UserRealm 中編寫使用者認證的判斷邏輯

測試一下!成功實作登入的認證操作!

導入Mybatis相關依賴

編寫配置檔案-連接配接配置 <code>application.yml</code>

編寫mybatis的配置 <code>application.properties</code>

編寫實體類,引入Lombok

編寫Mapper接口

編寫Mapper配置檔案

編寫UserService 層

好了,一口氣寫了這些正常操作,可以去測試一下了,保證能夠從資料庫中查詢出來

完全OK,成功查詢出來了!

改造UserRealm,連接配接到資料庫進行真實的操作!

測試,現在查詢都是從資料庫查詢的了!

參考部落格:https://blog.csdn.net/qq_34021712/article/details/84571067

思考?這個Shiro,是怎麼幫我們實作密碼自動比對的呢?

我們可以去 realm的父類 <code>AuthorizingRealm</code> 的父類 <code>AuthenticatingRealm</code> 中找一個方法 核心:

getCredentialsMatcher() 翻譯過來:獲驗證書比對器

我們去看這個接口 CredentialsMatcher 有很多的實作類,MD5鹽值加密

SpringBoot15:內建Shiro

我們的密碼一般都不能使用明文儲存?需要加密處理;思路分析

如何把一個字元串加密為MD5

替換目前的Realm 的 CredentialsMatcher 屬性,直接使用 Md5CredentialsMatcher 對象, 并設定加密算法

使用shiro的過濾器來攔截請求即可!

在 <code>ShiroFilterFactoryBean</code> 中添加一個過濾器

我們再次啟動測試一下,通路add,發現以下錯誤!未授權錯誤!

SpringBoot15:內建Shiro

注意:當我們實作權限攔截後,shiro會自動跳轉到未授權的頁面,但我們沒有這個頁面,所有401 了

配置一個未授權的提示的頁面,增加一個controller提示

然後在 <code>shiroFilterFactoryBean</code> 中配置一個未授權的請求頁面!

測試,現在沒有授權,可以跳轉到我們指定的位置了!

在UserRealm 中添加授權的邏輯,增加授權的字元串!

我們再次登入測試,發現登入的使用者是可以進行通路add 頁面了!授權成功! 問題,我們現在完全是寫死,無論是誰登入上來,都可以實作授權通過,但是真實的業務情況應該 是,每個使用者擁有自己的一些權限,進而進行操作,是以說,權限,應該在使用者的資料庫中,正常的情 況下,應該資料庫中是由一個權限表的,我們需要聯表查詢,但是這裡為了大家操作了解友善一些,我 們直接在資料庫表中增加一個字段來進行操作!

SpringBoot15:內建Shiro

修改實體類,增加一個字段

我們現在需要在自定義的授權認證中,擷取登入的使用者,進而實作動态認證授權操作!

在使用者登入認證的時候,将使用者放在 Principal 中,改造下之前的代碼

然後在授權的地方獲得這個使用者,進而獲得它的權限

我們給資料庫中的使用者增加一些權限

SpringBoot15:內建Shiro

在過濾器中,将 update 請求也進行權限攔截下

我們啟動項目,登入不同的賬戶,進行測試一下!

測試完美通過OK!

整合參考:https://github.com/theborakompanioni/thymeleaf-extras-shiro

根據權限展示不同的前端頁面

添加Maven的依賴;

配置一個shiro的Dialect ,在shiro的配置中增加一個Bean

修改前端的配置

導入命名空間

<code>xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"</code>

增權重限判斷

我們在去測試一下,可以發現,現在首頁什麼都沒有了,因為我們沒有登入,我們可以寫個登入 ,來判斷這個Shiro的效果!登入後,可以看到不同的使用者,有不同的效果,現在就已經接近完美了~!還不是最完美。

<code>guest</code>僅當目前<code>Subject</code>被視為“訪客”時,标簽才會顯示其包裝的内容

标簽參考:https://shiro.apache.org/web.html#Web-JSP%252FGSPTagLibrary