1. 程式人生 > >Shiro使用者認證和使用者授權流程

Shiro使用者認證和使用者授權流程

有時候覺得‘如約而至’是個多麼美好的詞,等的很辛苦,卻不辜負。——《匿名》

1、引言

傳統許可權管理使用基於url攔截的許可權管理方式,實現起來比較簡單,不依賴框架,使用web提供filter就可以實現。但是這種方式存在問題,需要將將所有的url全部配置到xml中起來,有些繁瑣,不易維護,url(資源)和許可權表示方式不規範。
這裡寫圖片描述
shiro是apache的一個開源框架,是一個許可權管理的框架,實現 使用者認證、使用者授權。

spring中有spring security (原名Acegi),是一個許可權框架,它和spring依賴過於緊密,沒有shiro使用簡單。

shiro不依賴於spring,shiro不僅可以實現 web應用的許可權管理,還可以實現c/s系統,分散式系統許可權管理,shiro屬於輕量框架,越來越多企業專案開始使用shiro。使用shiro實現系統的許可權管理,有效提高開發效率,從而降低開發成本。

2、shiro架構

這裡寫圖片描述

  • subject:主體,可以是使用者也可以是程式,主體要訪問系統,系統需要對主體進行認證、授權。

  • securityManager:安全管理器,主體進行認證和授權都是通過securityManager進行。

  • authenticator:認證器,主體進行認證最終通過authenticator進行的。

  • authorizer:授權器,主體進行授權最終通過authorizer進行的。

  • sessionManager:web應用中一般是用web容器對session進行管理,shiro也提供一套 - session管理的方式。

  • SessionDao: 通過SessionDao管理session資料,針對個性化的session資料儲存需要使用sessionDao。

  • cache Manager:快取管理器,主要對session和授權資料進行快取,比如將授權資料通過cacheManager進行快取管理,和ehcache整合對快取資料進行管理。

  • realm:域,領域,相當於資料來源,通過realm存取認證、授權相關資料。

注意:在realm中儲存授權和認證的邏輯。

  • cryptography:密碼管理,提供了一套加密/解密的元件,方便開發。比如提供常用的雜湊、加/解密等功能。比如 md5雜湊演算法。

3、shiro認證

這裡寫圖片描述

1、首先構造securityManager環境。
2、呼叫subject.login方法主體提交認證,提交的token。
3、securityManager進行認證,securityManager最終由ModularRealmAuthenticator進行認證。
4、ModularRealmAuthenticator呼叫IniRealm(給realm傳入token) 去ini配置檔案中查詢使用者資訊
5、IniRealm根據輸入的token(UsernamePasswordToken)從 shiro-first.ini查詢使用者資訊,根據賬號查詢使用者資訊(賬號和密碼)
如果查詢到使用者資訊,就給ModularRealmAuthenticator返回使用者資訊(賬號和密碼)
如果查詢不到,就給ModularRealmAuthenticator返回null
6、ModularRealmAuthenticator接收IniRealm返回Authentication認證資訊
如果返回的認證資訊是null,ModularRealmAuthenticator丟擲異常(org.apache.shiro.authc.UnknownAccountException)

如果返回的認證資訊不是null(說明inirealm找到了使用者),對IniRealm返回使用者密碼 (在ini檔案中存在)和 token中的密碼 進行對比,如果不一致丟擲異常(org.apache.shiro.authc.IncorrectCredentialsException)

程式碼演示如下:

shiro-first.ini
#對使用者資訊進行配置
[user]
#使用者賬號和密碼
zhangsan=111111
lisi=222222
// 使用者登陸和退出
    @Test
    public void testLoginAndLogout() {
        // 建立securityManager工廠,通過ini配置檔案建立securityManager工廠
        Factory<SecurityManager> factory = new IniSecurityManagerFactory(
                "classpath:shiro-first.ini");

        //建立SecurityManager
        SecurityManager securityManager = factory.getInstance();

        //將securityManager設定當前的執行環境中
        SecurityUtils.setSecurityManager(securityManager);

        //從SecurityUtils裡邊建立一個subject
        Subject subject = SecurityUtils.getSubject();

        //在認證提交前準備token(令牌)
        UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "111111");

        try {
            //執行認證提交
            subject.login(token);
        } catch (AuthenticationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        //是否認證通過
        boolean isAuthenticated =  subject.isAuthenticated();

        System.out.println("是否認證通過:" + isAuthenticated);

        //退出操作
        subject.logout();

        //是否認證通過
        isAuthenticated =  subject.isAuthenticated();

        System.out.println("是否認證通過:" + isAuthenticated);
    }

4、shiro授權

這裡寫圖片描述
演算法流程:
1、構造SecurityManager環境後,對subject進行授權,呼叫方法isPermitted(”permission串”)
2、SecurityManager執行授權,通過ModularRealmAuthorizer執行授權
3、ModularRealmAuthorizer執行realm(自定義的CustomRealm)從資料庫查詢許可權資料
呼叫realm的授權方法:doGetAuthorizationInfo

4、realm從資料庫查詢許可權資料,返回ModularRealmAuthorizer
5、ModularRealmAuthorizer呼叫PermissionResolver進行許可權串比對
6、如果比對後,isPermitted中”permission串”在realm查詢到許可權資料中,說明使用者訪問permission串有許可權,否則沒有許可權,丟擲異常。

4.1 Shiro 支援三種方式的授權:

  • (1)程式設計式:通過寫if/else 授權程式碼塊完成:
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole(“admin”)) {
//有許可權
} else {
//無許可權
}
  • (2)註解式:通過在執行的Java方法上放置相應
@RequiresRoles("admin")
public void hello() {
//有許可權
}
  • (3)JSP/GSP 標籤:在JSP/GSP 頁面通過相應的標籤完成:
<shiro:hasRole name="admin">
<!— 有許可權—>
</shiro:hasRole>

4.2 shiro-permission.ini內容

shiro-permission.ini裡邊的內容相當於在資料庫查詢。

#使用者
[users]
#使用者zhang的密碼是123,此使用者具有role1和role2兩個角色
zhang=123,role1,role2
wang=123,role2

#許可權
[roles]
#角色role1對資源user擁有createupdate許可權
role1=user:create,user:update
#角色role2對資源user擁有createdelete許可權
role2=user:create,user:delete
#角色role3對資源user擁有create許可權
role3=user:create

許可權識別符號號規則:資源:操作:例項(中間使用半形:分隔)
user:create:01 表示對使用者資源的01例項進行create操作。
user:create:表示對使用者資源進行create操作,相當於user:create:*,對所有使用者資源例項進行create操作。

user:*:01 表示對使用者資源例項01進行所有操作。

4.3 演算法步驟演示

這裡寫圖片描述

相關推薦

Shiro使用者認證使用者授權流程

有時候覺得‘如約而至’是個多麼美好的詞,等的很辛苦,卻不辜負。——《匿名》 1、引言 傳統許可權管理使用基於url攔截的許可權管理方式,實現起來比較簡單,不依賴框架,使用web提供filter就可以實現。但是這種方式存在問題,需要將將所有的url全部

SpringBoot整合Shiro登入認證授權(附demo)

SpringBoot整合Shiro登入認證和授權 廢話不多說,直接上程式碼: 程式碼有點多,想直接拿demo的直接拉到底 ps:demo忘了在哪拿的了,在他的基礎上改了一些 步驟一:pom.xml匯入依賴jar包 <dependencies

spring-boot(八) springboot整合shiro-登入認證許可權管理

Apache Shiro What is Apache Shiro? Apache Shiro是一個功能強大、靈活的,開源的安全框架。它可以乾淨利落地處理身份驗證、授權、企業會話管理和加密。 Apache Shiro的首要目標是易於使用和理解。安全通常很複雜,甚至讓人感到很痛苦,但是Shiro卻不是

Shiro認證不進授權的情況之一及解決方法

我的情況是隻走登入時自定義Realm的認證方法,授權方法進不去。自定義realm繼承的AuthorizingRealm抽象類,重寫doGetAuthenticationInfo(認證方法)和doGetAuthorizationInfo(授權方法)。 基本的配置

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

這篇文章我們來學習如何使用Spring Boot整合Apache Shiro。安全應該是網際網路公司的一道生命線,幾乎任何的公司都會涉及到這方面的需求。在Java領域一般有Spring Security、Apache Shiro等安全框架,但是由於Spring Sec

springboot整合shiro-登入認證許可權管理

這篇文章我們來學習如何使用Spring Boot整合Apache Shiro。安全應該是網際網路公司的一道生命線,幾乎任何的公司都會涉及到這方面的需求。在Java領域一般有Spring Security、Apache Shiro等安全框架,但是由於Spring Securit

Shiro認證流程授權流程

認證: 身份驗證,即在應用中誰能證明他就是他本人。一般提供如他們的身份ID一些標識資訊來表明他就是他本人,如提供身份證,使用者名稱/密碼來證明。 在shiro中,使用者需要提供principals (身份)和credentials(證明)給shiro,從而應

BOS項目 第7天(shiro權限框架進行認證授權)

ebs setattr not action 錯誤信息 add 流程圖 元素 錯誤提示 BOS項目筆記 第7天 今天內容安排: 1、權限概述(認證、授權) 2、常見的權限控制的方式(URL攔截權限控制、方法註解權限控制) 3、權限數據模型(權限表、角色表、用戶表、角色權

淺析shiro框架的認證授權

shiro安全框架 1.1.Shiro 概述 Shiro是apache旗下一個開源安全框架,它將軟體系統的安全認證相關的功能抽取出來,實現使用者身份認證,許可權授權、加密、會話管理等功能,組成了一個通用的安全認證框架,使用shiro就可以非常快速的完成認證、授權

原始碼分析shiro認證授權流程

1. shiro介紹 Apache Shiro是一個強大易用的Java安全框架,提供了認證、授權、加密和會話管理等功能:  認證 - 使用者身份識別,常被稱為使用者“登入”; 授權 - 訪問控制; 密碼加密 - 保護或隱藏資料防止被偷窺; 會話管理 - 每使用者相關的時間敏感的狀態。 對於

Shiro許可權框架認證授權原理介紹

1、簡介shiro是一個安全框架,是Apache的一個子專案。shiro提供了:認證、授權、加密、會話管理、與web整合、快取等模組。   1.1、模組介紹Authentication:使用者身份識別,可以認為是登入;Authorization:授權,即許可權驗證,驗證某個已

spring整合shiro認證授權

第一步:引入shiro框架相關的jar <!-- 引入shiro框架的依賴 --> <dependency> <groupId>org.apache.s

shiro 許可權框架認證授權原理

Shiro是一個安全框架,是Apache 的一個子專案。Shiro提供了:認證、授權、加密、會話管理、與Web整合、快取等模組。

【Spring-Security】【1】認證授權

部分 完整 業務 代碼 參數 web 用戶訪問 設置 管理權限 【認證】 憑據為基礎的認證: 當你登錄 e-mail 賬號時,你可能提供你的用戶名和密碼。E-mail的提供商會將你的用戶名與數據中的記錄進行匹配,並驗證你提供的密碼與對應的記錄是不是匹配。這些憑證(用戶名和

OAuth2.0認證授權原理

avi b2c 用戶授權 服務商 包括 facebook 自己的 borde 技術分享 什麽是OAuth授權? 一、什麽是OAuth協議 OAuth(開放授權)是一個開放標準。 允許第三方網站在用戶授權的前提下訪問在用戶在服務商那裏存儲的各種信息。 而這種授權無需將用

Yii2框架RESTful API教程(二) - 格式化響應,授權認證速率限制

formatter loginurl 而不是 filters ica cat 表示 程序 ssi 之前寫過一篇Yii2框架RESTful API教程(一) - 快速入門,今天接著來探究一下Yii2 RESTful的格式化響應,授權認證和速率限制三個部分 一、目錄結構 先

觀察模式發布/訂閱模式的區別

observe nbsp 初步 有時 觀察 觀察者 發生 狀態 發現 在事件總線(EventBus)的架構設計中,用到了發布/訂閱模式,但發現和觀察者模式挺接近,有時容易發生混淆,現試圖分清一下他們的關系。 觀察者模式的角色為觀察者(observer)

簡單兩步快速實現shiro的配置使用,包含登錄驗證、角色驗證、權限驗證以及shiro登錄註銷流程(基於spring的方式,使用maven構建)

protect login uid sim isa 當前 sub efi inf 前言: shiro因為其簡單、可靠、實現方便而成為現在最常用的安全框架,那麽這篇文章除了會用簡潔明了的方式講一下基於spring的shiro詳細配置和登錄註銷功能使用之外,也會根據慣例在文章最

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

sets man throws 將不 匹配 跳轉 ida 管理員 領域 原文出處: 純潔的微笑 這篇文章我們來學習如何使用Spring Boot集成Apache Shiro。安全應該是互聯網公司的一道生命線,幾乎任何的公司都會涉及到這方面的需求。在Java領域一般有Spri

關於認證授權

html open ber sdn framework images fis 關於 .com 這裏設計的內容比較多; cookie, form認證,request,response,IPriciple,Identity,menberhsip,claim,owin,middl