您好,登錄后才能下訂單哦!
這篇文章主要講解了“什么是Shiro”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“什么是Shiro”吧!
Shiro項目的全名是Apache Shiro,后續簡稱Shiro,是一個關于安全的框架,在Shiro官網具體介紹如下:
Apache Shiro? is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management. With Shiro’s easy-to-understand API, you can quickly and easily secure any application – from the smallest mobile applications to the largest web and enterprise applications.
from: https://shiro.apache.org/
在這段介紹中可以看出Shiro是一個功能強大且易用的Java安全框架,它包含了身份驗證、授權、加密和會話管理等功能。并且Shiro具有易于理解的API,可以快速輕松的保護任何應用程序。
本節將解釋為什么使用Shiro框架,在使用Shiro的主要原因中包含如下幾點:
易于使用:在Shiro中因為具備易于理解的API定義和優秀的抽象從而使開發在在使用Shiro時十分方便易于上手。
全面:Shiro提供了關于權限認證的各類基礎模型定義并對其進行了抽象涵蓋的內容相對全面。
靈活:Shiro幾乎可以在任何程序環境中執行工作,包括且不限于Java開發中的Spring、EJB等。
本節將對Shiro的處理流程做簡單說明,在Shiro官方文檔中可以搜索到下圖:
from:https://shiro.apache.org/architecture.html
在上圖中可以發現Shiro中整體處理流程是通過Subject對象、SecurityManager對象和Realm對象組成。
Subject對象可以理解為用戶。
SecurityManager對象可以理解為安全管理器,主要目的是管理Subject對象。
Realm對象可以理解為權限資源。
本節將對Shiro的架構進行說明,在Shiro的官方文檔中可以搜索到下圖。
from:https://shiro.apache.org/architecture.html
在上圖中可以發現在Shiro架構中分為如下幾個內容:
Subject:主題。一般情況下是用戶。
Security Manager:安全管理器,它是整個Shiro的核心
Authenticator:認證器。
Authentication Strategy:認證策略。
Authorizer:授權器。
SessionManager:Session 管理器。
SessionDAO:Session 持久操作
CacheManager:緩存管理器
Cryptography:密碼學相關內容,主要負責加密解密。
Realms:領域,權限。
在Shiro中主要的對象就是上面八個,在后續的開發過程中會經常使用到,它們組成了Shiro的各種功能
下面將對Shiro的基本認證過程做說明,在Shiro的官網可以看到如下圖片:
from: https://shiro.apache.org/authentication.html
從上圖中可以發現關于Shiro的認證過程包含五個步驟:
應用程序調用Subject.login方法將token作為參數構件Subject對象。
將步驟一中得到的Subject對象傳遞到SecurityManager中。
在SecurityManager中將認證交給Authenticator對象處理。
在Authenticator中具體的處理是由AuthenticationStrategy認證策略進行實際處理。
在AuthenticationStrategy處理過程中回去尋找Realm數據信息對其進行認證。
下面將對Shiro的基本授權過程做說明,在Shiro的官網可以看到如下圖片:
from: https://shiro.apache.org/authorization.html
從上圖中可以發現關于Shiro的授權過程包含四個步驟:
Subject對象調用isPermitted*
、hasRole*
、checkRole*
或checkPermission*
方法。
SecurityManager進行授權判斷,具體處理將委托Authorizer類進行。
在Authorizer處理過程中會依賴Realm相關操作。
Realm檢查相關配置。
在前文對Shiro做了一些基本概念的介紹,本節將使用Shiro搭建一個簡單的用例,主要實現認證相關處理操作。在確認目標后需要率先選擇Shiro的版本,在本文編寫期間Shiro的版本更新到了1.7.1,具體maven依賴如下:
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.7.1</version> </dependency>
關于JDK的版本具體信息如下:
openjdk version "1.8.0_282" OpenJDK Runtime Environment Corretto-8.282.08.1 (build 1.8.0_282-b08) OpenJDK 64-Bit Server VM Corretto-8.282.08.1 (build 25.282-b08, mixed mode)
在完成這基本的技術選型后需要進行工程創建,本例采用的是maven進行管理,具體的POM文件內容如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>shiro-book</artifactId> <groupId>com.github.huifer</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>just-shiro</artifactId> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.7.1</version> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.ini</include> </includes> </resource> </resources> </build> </project>
注意: 這里采用的是父子工程,如果不采用父子工程請直接使用下面兩個依賴
<dependencies> <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.7.1</version> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.ini</include> </includes> </resource> </resources> </build>
在工程創建完成后需要先編寫一個配置文件,該配置文件用于存放賬號密碼,文件名可以任意設置,在本例中使用的文件名為shiro.ini
,該文件需要放在resources
文件夾下,具體內容如下:
[users] admin=admin userAdd=userAdd
在該文件中定義了兩個用戶,等號左側是用戶名,等號右側是密碼,在后續的測試用例中將會使用。下面編寫一個測試方法,具體代碼如下:
import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.mgt.DefaultSecurityManager; import org.apache.shiro.realm.text.IniRealm; import org.apache.shiro.subject.Subject; public class TestAuthenticator { public static void main(String[] args) { // 1. 創建安全管理器對象 DefaultSecurityManager securityManager = new DefaultSecurityManager(); // 2. 設置 realm 數據 securityManager.setRealm(new IniRealm("classpath:shiro.ini")); // 3. 設置安全工具類相關數據 SecurityUtils.setSecurityManager(securityManager); // 4. 從安全工具類中獲取 subject 對象 Subject subject = SecurityUtils.getSubject(); // 5. 創建令牌 UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("admin", "admin"); // 6. 登陸 // 認證狀態 boolean authenticated = subject.isAuthenticated(); System.out.println("登錄前的認證狀態" + authenticated); subject.login(usernamePasswordToken); authenticated = subject.isAuthenticated(); System.out.println("登錄后的認證狀態" + authenticated); } }
在邊編寫完成上輸代碼后可以嘗試執行改代碼,執行結果如下:
登錄前的認證狀態false 登錄后的認證狀態true
在這個簡單的Shiro用例中主要執行的操作有如下六個步驟:
創建默認的安全管理器對象,其本質實際上是SecurityManager。
設置Realm數據,本例采用的是靜態配置。
安全工具類中設置安全管理器。
從安全工具類中提取Subject對象。
創建令牌,此時的令牌采用的是賬號密碼的形式。
進行登陸操作,主要執行subject.login
方法,參數是令牌。
通過上述六個操作可以制作一個簡單的用戶登陸驗證,下面將模擬用戶名錯誤,密碼錯誤從而了解Shiro中的兩個基本異常。首先將UsernamePasswordToken構造器中的第一個參數用戶名任意修改,修改后內容如下:
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("admin1", "admin");
在修改后執行程序控制臺輸出內容如下:
Exception in thread "main" org.apache.shiro.authc.UnknownAccountException: Realm [org.apache.shiro.realm.text.IniRealm@5b80350b] was unable to find account data for the submitted AuthenticationToken [org.apache.shiro.authc.UsernamePasswordToken - admin1, rememberMe=false]. at org.apache.shiro.authc.pam.ModularRealmAuthenticator.doSingleRealmAuthentication(ModularRealmAuthenticator.java:184) at org.apache.shiro.authc.pam.ModularRealmAuthenticator.doAuthenticate(ModularRealmAuthenticator.java:273) at org.apache.shiro.authc.AbstractAuthenticator.authenticate(AbstractAuthenticator.java:198) at org.apache.shiro.mgt.AuthenticatingSecurityManager.authenticate(AuthenticatingSecurityManager.java:106) at org.apache.shiro.mgt.DefaultSecurityManager.login(DefaultSecurityManager.java:275) at org.apache.shiro.subject.support.DelegatingSubject.login(DelegatingSubject.java:260) at com.github.huifer.shiro.TestAuthenticator.main(TestAuthenticator.java:31)
此時可以發現出現了異常,該異常表示的就是用戶名錯誤,具體異常對象是UnknownAccountException。下面將模擬密碼錯誤的異常,將UsernamePasswordToken構造器中的第二個參數密碼任意修改,修改后內容如下:
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("admin", "admin1");
在修改后執行程序控制臺輸出內容如下:
Exception in thread "main" org.apache.shiro.authc.IncorrectCredentialsException: Submitted credentials for token [org.apache.shiro.authc.UsernamePasswordToken - admin, rememberMe=false] did not match the expected credentials. at org.apache.shiro.realm.AuthenticatingRealm.assertCredentialsMatch(AuthenticatingRealm.java:603) at org.apache.shiro.realm.AuthenticatingRealm.getAuthenticationInfo(AuthenticatingRealm.java:581) at org.apache.shiro.authc.pam.ModularRealmAuthenticator.doSingleRealmAuthentication(ModularRealmAuthenticator.java:180) at org.apache.shiro.authc.pam.ModularRealmAuthenticator.doAuthenticate(ModularRealmAuthenticator.java:273) at org.apache.shiro.authc.AbstractAuthenticator.authenticate(AbstractAuthenticator.java:198) at org.apache.shiro.mgt.AuthenticatingSecurityManager.authenticate(AuthenticatingSecurityManager.java:106) at org.apache.shiro.mgt.DefaultSecurityManager.login(DefaultSecurityManager.java:275) at org.apache.shiro.subject.support.DelegatingSubject.login(DelegatingSubject.java:260) at com.github.huifer.shiro.TestAuthenticator.main(TestAuthenticator.java:31)
此時可以發現出現了異常,該異常表示的就是密碼驗證錯誤,具體異常對象是IncorrectCredentialsException。
感謝各位的閱讀,以上就是“什么是Shiro”的內容了,經過本文的學習后,相信大家對什么是Shiro這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。