天天看點

springboot(十四):springboot整合shiro-登入認證和權限管理

這篇文章我們來學習如何使用spring boot內建apache shiro。安全應該是網際網路公司的一道生命線,幾乎任何的公司都會涉及到這方面的需求。在java領域一般有spring security、apache shiro等安全架構,但是由于spring security過于龐大和複雜,大多數公司會選擇apache shiro來使用,這篇文章會先介紹一下apache shiro,在結合spring boot給出使用案例。

apache shiro是一個功能強大、靈活的,開源的安全架構。它可以幹淨利落地處理身份驗證、授權、企業會話管理和加密。

apache shiro的首要目标是易于使用和了解。安全通常很複雜,甚至讓人感到很痛苦,但是shiro卻不是這樣子的。一個好的安全架構應該屏蔽複雜性,向外暴露簡單、直覺的api,來簡化開發人員實作應用程式安全所花費的時間和精力。

shiro能做什麼呢?

驗證使用者身份

使用者通路權限控制,比如:1、判斷使用者是否配置設定了一定的安全角色。2、判斷使用者是否被授予完成某個操作的權限

在非 web 或 ejb 容器的環境下可以任意使用session api

可以響應認證、通路控制,或者 session 生命周期中發生的事件

可将一個或以上使用者安全資料源資料組合成一個複合的使用者 “view”(視圖)

支援單點登入(sso)功能

支援提供“remember me”服務,擷取使用者關聯資訊而無需登入

等等——都內建到一個有凝聚力的易于使用的api。

shiro 緻力在所有應用環境下實作上述功能,小到指令行應用程式,大到企業應用中,而且不需要借助第三方架構、容器、應用伺服器等。當然 shiro 的目的是盡量的融入到這樣的應用環境中去,但也可以在它們之外的任何環境下開箱即用。

apache shiro是一個全面的、蘊含豐富功能的安全架構。下圖為描述shiro功能的架構圖:

springboot(十四):springboot整合shiro-登入認證和權限管理

authentication(認證), authorization(授權), session management(會話管理), cryptography(加密)被 shiro 架構的開發團隊稱之為應用安全的四大基石。那麼就讓我們來看看它們吧:

authentication(認證):使用者身份識别,通常被稱為使用者“登入”

authorization(授權):通路控制。比如某個使用者是否具有某個操作的使用權限。

session management(會話管理):特定于使用者的會話管理,甚至在非web 或 ejb 應用程式。

cryptography(加密):在對資料源使用加密算法加密的同時,保證易于使用。

還有其他的功能來支援和加強這些不同應用環境下安全領域的關注點。特别是對以下的功能支援:

web支援:shiro 提供的 web 支援 api ,可以很輕松的保護 web 應用程式的安全。

緩存:緩存是 apache shiro 保證安全操作快速、高效的重要手段。

并發:apache shiro 支援多線程應用程式的并發特性。

測試:支援單元測試和內建測試,確定代碼和預想的一樣安全。

“run as”:這個功能允許使用者假設另一個使用者的身份(在許可的前提下)。

“remember me”:跨 session 記錄使用者的身份,隻有在強制需要時才需要登入。

注意: shiro不會去維護使用者、維護權限,這些需要我們自己去設計/提供,然後通過相應的接口注入給shiro

在概念層,shiro 架構包含三個主要的理念:subject,securitymanager和 realm。下面的圖展示了這些元件如何互相作用,我們将在下面依次對其進行描述。

springboot(十四):springboot整合shiro-登入認證和權限管理

subject:目前使用者,subject 可以是一個人,但也可以是第三方服務、守護程序帳戶、時鐘守護任務或者其它–目前和軟體互動的任何事件。

securitymanager:管理所有subject,securitymanager 是 shiro 架構的核心,配合内部安全元件共同組成安全傘。

realms:用于進行權限資訊的驗證,我們自己實作。realm 本質上是一個特定的安全 dao:它封裝與資料源連接配接的細節,得到shiro 所需的相關的資料。在配置 shiro 的時候,你必須指定至少一個realm 來實作認證(authentication)和/或授權(authorization)。

我們需要實作realms的authentication 和 authorization。其中 authentication 是用來驗證使用者身份,authorization 是授權通路控制,用于對使用者進行的操作授權,證明該使用者是否允許進行目前操作,如通路某個連結,某個資源檔案等。

pom包依賴

重點是 shiro-spring包

配置檔案

thymeleaf的配置是為了去掉html的校驗

頁面

我們建立了六個頁面用來測試:

index.html :首頁

login.html :登入頁

userinfo.html : 使用者資訊頁面

userinfoadd.html :添加使用者頁面

userinfodel.html :删除使用者頁面

403.html : 沒有權限的頁面

除過登入頁面其它都很簡單,大概如下:

rbac 是基于角色的通路控制(role-based access control )在 rbac 中,權限與角色相關聯,使用者通過成為适當角色的成員而得到這些角色的權限。這就極大地簡化了權限的管理。這樣管理都是層級互相依賴的,權限賦予給角色,而把角色又賦予使用者,這樣的權限設計很清楚,管理起來很友善。

采用jpa技術來自動生成基礎表格,對應的entity如下:

使用者資訊

角色資訊

權限資訊

根據以上的代碼會自動生成user_info(使用者資訊表)、sys_role(角色表)、sys_permission(權限表)、sys_user_role(使用者角色表)、sys_role_permission(角色權限表)這五張表,為了友善測試我們給這五張表插入一些初始化資料:

首先要配置的是shiroconfig類,apache shiro 核心通過 filter 來實作,就好像springmvc 通過dispachservlet 來主要制一樣。 既然是使用 filter 一般也就能猜到,是通過url規則來進行過濾和權限校驗,是以我們需要定義一系列關于url的規則和通路權限。

shiroconfig

filter chain定義說明:

1、一個url可以配置多個filter,使用逗号分隔

2、當設定多個過濾器時,全部驗證通過,才視為通過

3、部分過濾器可指定參數,如perms,roles

shiro内置的filterchain

springboot(十四):springboot整合shiro-登入認證和權限管理

anon:所有url都都可以匿名通路

authc: 需要認證才能進行通路

user:配置記住我或認證通過可以通路

登入認證實作

在認證、授權内部實作機制中都有提到,最終處理都将交給real進行處理。因為在shiro中,最終是通過realm來擷取應用程式中的使用者、角色及權限資訊的。通常情況下,在realm中會直接從我們的資料源中擷取shiro需要的驗證資訊。可以說,realm是專用于安全架構的dao. shiro的認證過程最終會交由realm執行,這時會調用realm的getauthenticationinfo(token)方法。

該方法主要執行以下操作:

1、檢查送出的進行認證的令牌資訊

2、根據令牌資訊從資料源(通常為資料庫)中擷取使用者資訊

3、對使用者資訊進行比對驗證。

4、驗證通過将傳回一個封裝了使用者資訊的authenticationinfo執行個體。

5、驗證失敗則抛出authenticationexception異常資訊。

而在我們的應用程式中要做的就是自定義一個realm類,繼承authorizingrealm抽象類,重載dogetauthenticationinfo(),重寫擷取使用者資訊的方法。

dogetauthenticationinfo的重寫

連結權限的實作

shiro的權限授權是通過繼承authorizingrealm抽象類,重載dogetauthorizationinfo();當通路到頁面的時候,連結配置了相應的權限或者shiro标簽才會執行此方法否則不會執行,是以如果隻是簡單的身份認證沒有權限的控制的話,那麼這個方法可以不進行實作,直接傳回null即可。在這個方法中主要是使用類:simpleauthorizationinfo進行角色的添加和權限的添加。

當然也可以添加set集合:roles是從資料庫查詢的目前使用者的角色,stringpermissions是從資料庫查詢的目前使用者對應的權限

就是說如果在shiro配置檔案中添加了filterchaindefinitionmap.put(“/add”, “perms[權限添加]”);就說明通路/add這個連結必須要有“權限添加”這個權限才可以通路,如果在shiro配置檔案中添加了filterchaindefinitionmap.put(“/add”, “roles[100002],perms[權限添加]”);就說明通路/add這個連結必須要有“權限添加”這個權限和具有“100002”這個角色才可以通路。

登入實作

登入過程其實隻是處理異常的相關資訊,具體的登入驗證交給shiro來處理

其它dao層和service的代碼就不貼出來了大家直接看代碼。

1、編寫好後就可以啟動程式,通路index頁面,由于沒有登入就會跳轉到login頁面。登入之後就會跳轉到index頁面,登入後,有直接在浏覽器中輸入index頁面通路,又會跳轉到login頁面。上面這些操作時候觸發myshirorealm.dogetauthenticationinfo()這個方法,也就是登入認證的方法。

3、修改admin不同的權限進行測試

shiro很強大,這僅僅是完成了登入認證和權限管理這兩個功能,更多内容以後有時間再做探讨。

作者:純潔的微笑