shiro教程1(HelloWorld)

shiro簡介

shiro官網

shiro教程1(HelloWorld)

Apache Shiro是一個強大且易用的Java安全框架,執行身份驗證、授權、密碼和會話管理。使用Shiro的易於理解的API,您可以快速、輕鬆地獲得任何應用程序,從最小的移動應用程序到最大的網絡和企業應用程序。

框架圖說明

官網架構說明

從外部查看shiro框架

shiro教程1(HelloWorld)

應用代碼直接交互的對象是Subject,也就是說Shiro的對外API核心就是Subject

shiro教程1(HelloWorld)

內部結構框架

shiro教程1(HelloWorld)

shiro教程1(HelloWorld)

常見單詞說明

shiro教程1(HelloWorld)

Shiro中的shiro.ini說明

shiro.ini放置在classpath路徑下shiro會自動查找。

ini配置文件中有四大主要配置類

main users roles urls

main

提供了對根對象securityManager及其依賴對象的配置

#創建對象
securityManager=org.apache.shiro.mgt.DefaultSecurityManager

其構造器必須是public空參構造器,通過反射創建相應的實例。

  1. 對象名=全限定類名 相對於調用public無參構造器創建對象
  2. 對象名.屬性名=值 相當於調用setter方法設置常量值
  3. 對象名.屬性名=$對象引用 相當於調用setter方法設置對象引用

users

提供了對用戶/密碼及其角色的配置,用戶名=密碼,角色1,角色2
username=password,role1,role2
例如:配置用戶名/密碼及其角色,格式:“用戶名=密碼,角色1,角色2”,角色部分可省略。如:

[users] 
zhang=123,role1,role2
wang=123

roles

提供了角色及權限之間關係的配置,角色=權限1,權限2 role1 = permission1 , permission2
例如:配置角色及權限之間的關係,格式:“角色=權限1,權限2”;如:

[roles] 
role1=user:create,user:update
role2=*

如果只有角色沒有對應的權限,可以不配roles

urls

用於web,提供了對web url攔截相關的配置,url=攔截器[參數],攔截器

/index.html = anon 
/admin/** = authc, roles[admin],perms["permission1"]

第一個案例

官方教程

添加對應的依賴

<dependency>
\t<groupid>org.apache.shiro/<groupid>
\t<artifactid>shiro-core/<artifactid>
\t<version>1.1.0/<version>
/<dependency>
<dependency>
\t<groupid>org.slf4j/<groupid>
\t<artifactid>slf4j-simple/<artifactid>
\t<version>1.6.1/<version>
\t<scope>test/<scope>

/<dependency>

<dependency>
\t<groupid>junit/<groupid>
\t<artifactid>junit/<artifactid>
\t<version>4.12/<version>
\t<scope>test/<scope>
/<dependency>
<dependency>
\t<groupid>commons-logging/<groupid>
\t<artifactid>commons-logging/<artifactid>
\t<version>1.2/<version>
/<dependency>

添加shiro.ini文件

src/main/resource下添加

shiro教程1(HelloWorld)

添加內容如下

[users]
root = 123456
# 賬號為root 密碼是 123456

認證操作

@Test
public void test() {
\t// 1.獲取SecurityManager工廠對象
\tFactory<securitymanager> factory =
\t\t\tnew IniSecurityManagerFactory("classpath:shiro.ini");
\t// 2.通過Factory對象獲取SecurityManager對象
\tSecurityManager securityManager = factory.getInstance();
\t// 3.將SecurityManager對象添加到當前運行環境中
\tSecurityUtils.setSecurityManager(securityManager);
\t
\t// 4.獲取Subject對象
\tSubject subject = SecurityUtils.getSubject();
\tAuthenticationToken token = new UsernamePasswordToken("root", "123456");
\t// 登錄操作
\tsubject.login(token);
\t// 獲取登錄的狀態
\tSystem.out.println(subject.isAuthenticated());
}/<securitymanager>

測試

賬號密碼正確

shiro教程1(HelloWorld)

賬號錯誤

shiro教程1(HelloWorld)

賬號錯誤拋 UnknownAccountException異常

密碼錯誤

shiro教程1(HelloWorld)

密碼錯誤會拋 IncorrectCredentialsException異常

所以代碼可以調整下:

\t@Test
\tpublic void test() {
\t\t// 1.獲取SecurityManager工廠對象
\t\tFactory<securitymanager> factory =
\t\t\t\tnew IniSecurityManagerFactory("classpath:shiro.ini");
\t\t// 2.通過Factory對象獲取SecurityManager對象
\t\tSecurityManager securityManager = factory.getInstance();
\t\t// 3.將SecurityManager對象添加到當前運行環境中
\t\tSecurityUtils.setSecurityManager(securityManager);
\t\t
\t\t// 4.獲取Subject對象
\t\tSubject subject = SecurityUtils.getSubject();
\t\tAuthenticationToken token = new UsernamePasswordToken("root", "111");
\t\t// 登錄操作
\t\ttry {
\t\t\tsubject.login(token);
\t\t} catch (UnknownAccountException e) {
\t\t\tSystem.out.println("賬號出錯...");
\t\t} catch(IncorrectCredentialsException e){
\t\t\tSystem.out.println("密碼出錯...");
\t\t}
\t\t// 獲取登錄的狀態
\t\tSystem.out.println(subject.isAuthenticated());
\t}/<securitymanager>

認證流程總結

login方法

shiro教程1(HelloWorld)

DelegatingSubject中的login方法

shiro教程1(HelloWorld)

在此方法中我們看到是 SecurityManager來管理認證操作的
繼續進入

進入DefaultSecurityManager的login方法

shiro教程1(HelloWorld)

此方法中調用Authenticator認證

shiro教程1(HelloWorld)

AbstractAuthenticator認證

shiro教程1(HelloWorld)

ModularRealmAuthenticator

shiro教程1(HelloWorld)

在該方法中獲取ini文件中的信息,加載解析不是在次方法中。

shiro教程1(HelloWorld)

AuthenticatingRealm

shiro教程1(HelloWorld)

流程描述

  1. 創建token令牌,token中有用戶提交的認證信息即賬號和密碼
  2. 執行subject.login(token),最終由securityManager通過Authenticator進行認證
  3. Authenticator的實現ModularRealmAuthenticator調用realm從ini配置文件取用戶真實的賬號和密碼,這裡使用的是IniRealm(shiro自帶)
  4. IniRealm先根據token中的賬號去ini中找該賬號,如果找不到則給ModularRealmAuthenticator返回null,如果找到則匹配密碼,匹配密碼成功則認證通過。


分享到:


相關文章: