Shiro 權限校驗分析

2020-12-25 黑馬程式設計師

Shiro 概述

Shiro 是一款 Apache 提供的權限校驗框架, Shiro 同時也是一個強大且易用的 Java 安全框架,執行身份驗證、授權、密碼學和會話管理。使用 Shiro 的易於理解的 API,您可以快速、輕鬆地獲得任何應用程式,從最小的行動應用程式到最大的網絡和企業應用程式,特別是今天對權限校驗和管理特別嚴格,大家有必要對shiro 有一個基本的認識和學習。

Shiro 的三大核心組件

1、Subject :當前用戶的操作

2、SecurityManager:用於管理所有的 Subject 3、Realms:用於進行權限信息的驗證

如下圖:各組件之間的調用關係:

Subject:翻譯為主角,當前參與應用安全部分的主角。可以是用戶,可以試第三方服務,可以是 cron 任務,或者任何東西。主要指一個正在與當前軟體交互的東西。所有 Subject 都需要 SecurityManager,當你與 Subject 進行交互,這些交互行為實際上被轉換為與 SecurityManager 的交互

SecurityManager:安全管理員,Shiro 架構的核心,它就像 Shiro 內部所有原件的保護傘。然而一旦配置了 SecurityManager,SecurityManager 就用到的比較少,開發者大部分時間都花在 Subject 上面請記得,當你與 Subject 進行

交互的時候,實際上是 SecurityManager 在背後幫你舉起 Subject 來做一些安全操作。

Realms:Realms 作為 Shiro 和你的應用的連接橋,當需要與安全數據交互的時候,像用戶帳戶,或者訪問控制,Shiro 就從一個或多個 Realms 中查找。Shiro 提供了一些可以直接使用的 Realms,如果默認的 Realms 不能滿足你的需求,你也可以定製自己的 Realms.

Shiro 的十大功能特點:

功能特點

Shiro 包含 10 個內容,如下圖:

Authentication:身份認證/登錄,驗證用戶是不是擁有相應的身份。Authorization:授權,即權限驗證,驗證某個已認證的用戶是否擁有某個權限; 即判斷用戶是否能做事情,常見的如:驗證某個用戶是否擁有某個角色。或者細粒度的驗證某個用戶對某個資源是否具有某個權限。Session Manager:會話管理,即用戶登錄後就是一次會話,在沒有退出之前,它的所有信息都在會話中;會話可以是普通 JavaSE 環境的,也可以是如 Web 環境的。Cryptography:加密,保護數據的安全性,如密碼加密存儲到資料庫,而不是明文存儲。Web Support:Web 支持,可以非常容易的集成到 web 環境。Caching:緩存,比如用戶登錄後,其用戶信息、擁有的角色/權限不必每次去查, 這樣可以提高效率。Concurrency:shiro 支持多線程應用的並發驗證,即如在一個線程中開啟另一個線程,能把權限自動傳播過去。Testing:提供測試支持。Run As:允許一個用戶假裝為另一個用戶(如果他們允許)的身份進行訪問。Remember Me:記住我,這個是非常常見的功能,即一次登錄後,下次再來的話不用登錄了。Shiro 的運行原理

Subject:主體,可以看到主體可以是任何與應用交互的「用戶」。

SecurityManager:相當於 SpringMVC 中的 DispatcherServlet 或者 Struts2 中的 FilterDispatcher。它是 Shiro 的核心,所有具體的交互都通過

SecurityManager 進行控制。它管理著所有 Subject、且負責進行認證和授權、及會話、緩存的管理。

Authenticator:認證器,負責主體認證的,這是一個擴展點,如果用戶覺得Shiro 默認的不好,我們可以自定義實現。其需要認證策略(Authentication Strategy),即什麼情況下算用戶認證通過了。

Authrizer:授權器,或者訪問控制器。它用來決定主體是否有權限進行相應的操作,即控制著用戶能訪問應用中的哪些功能。

Realm:可以有 1 個或多個 Realm,可以認為是安全實體數據源,即用於獲取安全實體的。它可以是 JDBC 實現,也可以是 LDAP 實現,或者內存實現等。

SessionManager:如果寫過 Servlet 就應該知道 Session 的概念,Session 需要有人去管理它的生命周期,這個組件就是 SessionManager。而 Shiro 並不僅僅可以用在 Web 環境,也可以用在如普通的 JavaSE 環境。

SessionDAO:DAO 大家都用過,數據訪問對象,用於會話的 CRUD。我們可以自定義 SessionDAO 的實現,控制 session 存儲的位置。如通過 JDBC 寫到資料庫或通過jedis 寫入 redis 中。另外 SessionDAO 中可以使用 Cache 進行緩存,以提高性能。

CacheManager:緩存管理器。它來管理如用戶、角色、權限等的緩存的。因為這些數據基本上很少去改變,放到緩存中後可以提高訪問的性能。

Cryptography:密碼模塊,Shiro 提高了一些常見的加密組件用於如密碼加密/解密的。

Shiro 的基本入門

今天我們演示 Shiro 的入門,沒有整合任何框架,只是單純的演示 Shiro 運行原理,所以無需創建經典的五張表

使用 Idea 創建一個 Maven 項目

在 pom.xml 中添加如下依賴:

<!—配置 shiro 依賴-->

<dependencies>

<dependency>

<groupId>org.apache.shiro</groupId>

<artifactId>shiro-core</artifactId>

<version>1.2.3</version>

</dependency>

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-simple</artifactId>

<version>1.6.1</version>

</dependency>

</dependencies>

任意創建一個包,在裡面創建一個測試的 Demo 類:

package me.aihe;import org.slf4j.Logger; import org.slf4j.LoggerFactory;

public class Demo{

private static final transient Logger log = LoggerFactory.getLogger(Tutorial.class); public static void main(String[] args) {

log.info("My First Apache Shiro Application"); System.exit(0);

}

}創建一個 shiro.ini 配置文件

Shiro 提供了一個通用的方案通過 INI 進行配置 ,當然也可以通過 XML,YMAL,JSON 等進行配置。在 resource 目錄下面,創建一個 shiro.ini 的文件。內容如下:

# -------------------------------------------------------------------------

# Users and their (optional) assigned roles

# username = password, role1, role2, ..., roleN

# -------------------------------------------------------------------------

[users]

root = secret, admin guest = guest, guest

presidentskroob = 12345, president

darkhelmet = ludicrousspeed, darklord, schwartz aihe = aihe, goodguy, client

# -------------------------------------------------------------------------

# Roles with assigned permissions

# roleName = perm1, perm2, ..., permN

# -------------------------------------------------------------------------

[roles] admin = *

client = look:*

goodguy = winnebago:drive:eagle5

引用 Shiro.ini 配置進行測試

現在改變我們的 Demo 類文件,內容如下

import org.apache.shiro.authc.*;

import org.apache.shiro.config.IniSecurityManagerFactory;

import org.apache.shiro.mgt.SecurityManager;

import org.apache.shiro.session.Session;

import org.apache.shiro.subject.Subject;

import org.apache.shiro.util.Factory;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

public class Demo {

private static final transient Logger log = LoggerFactory.getLogger(Tutorial.class);

public static void main(String[] args) { log.info("My First Apache Shiro Application");

//1. 這裡的 SecurityManager 是 org.apache.shiro.mgt.SecurityManager,而不是

//java.lang.SecurityManager 加載配置文件

Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");

//2.解析配置文件,並且返回一些 SecurityManger 實例

SecurityManager securityManager = factory.getInstance();

//3.設置 SecurityManager 到靜態內存區,單例模式

SecurityUtils.setSecurityManager(securityManager);

// 安全操作

Subject currentUser = SecurityUtils.getSubject();

// 在應用的當前會話中設置屬性

Session session = currentUser.getSession(); session.setAttribute("key","value");

//當前我們的用戶是匿名的用戶,我們嘗試進行登錄,

if(!currentUser.isAuthenticated()){

UsernamePasswordToken token = new UsernamePasswordToken("aihe", "aihe");

token.setRememberMe(true);

//嘗試進行登錄用戶,如果登錄失敗了,我們進行一些處理

try{ currentUser.login(token);

//當我們獲登錄用戶之後

log.info("User [" + currentUser.getPrincipal() + "] logged in successfully.");

// 查看用戶是否有指定的角色

if ( currentUser.hasRole( "client" ) ) {

log.info("Look is in your role" ); } else { log.info( ". " );

}

// 查看用戶是否有某個權限

if ( currentUser.isPermitted( "look:desk" ) ) {

log.info("You can look. Use it wisely.");

} else {

log.info("Sorry, you can't look.");

}

if ( currentUser.isPermitted( "winnebago:drive:eagle5" ) ) {

log.info("You are permitted to 'drive' the 'winnebago' with license plate (id) 'eagle5'. " + "Here are

the keys - have fun!");

} else {

log.info("Sorry, you aren't allowed to drive the 'eagle5' winnebago!");

}

//登出currentUser.logout();

} catch ( UnknownAccountException uae ) {

//帳戶不存在的操作

} catch ( IncorrectCredentialsException ice ) {

//密碼不正確

} catch ( LockedAccountException lae ) {

//用戶被鎖定了

} catch ( AuthenticationException ae ) {

//無法判斷的情形

}

}

System.exit(0); }

}

通過 shiro 演示,我們學到了什麼

這個相對來說是一個簡單的程序,但也證明了一些 shiro 的基本用法,我們可以通過shiro 進行認證,權限控制等。

本文對 Shiro 進行了一個基本介紹,Shiro 具體在開發中的實際應用,以及更多在開發中的應用,我們並沒有具體說太多,比如和其它框架的整合等等,如果想對 Shiro 有更多的了解,請前往官網查閱。

相關焦點

  • 「網絡安全」關於Apache Shiro權限繞過高危漏洞的 預警通報
    近日,國家信息安全漏洞共享平臺(CNVD)公布了深信服終端檢測平臺(EDR)遠程命令執行高危漏洞,攻擊者利用該漏洞可遠程執行系統命令,獲得目標伺服器的權限。由於shiro在處理url時與spring存在差異,處理身份驗證請求時出錯導致存在身份校驗繞過漏洞,遠程攻擊者可以發送特製的HTTP請求,繞過身份驗證過程並獲得對應用程式的未授權訪問。二、影響範圍 Apache Shiro < 1.6.0。
  • Shiro的授權和Session管理(三)
    ;import org.apache.shiro.mgt.SecurityManager;import org.apache.shiro.subject.Subject;import org.apache.shiro.util.Factory;/** * * @author 兩個蝴蝶飛 * Shiro 角色的測試 */
  • Spring Boot與Shiro整合實現用戶認證
    分析Shiro的核心APISubject: 用戶主體(把操作交給SecurityManager)SecurityManager:安全管理器(關聯Realm)Realm:Shiro連接數據的橋梁1.2.-- shiro與spring整合依賴 --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version
  • Apache Shiro 反序列化之殤
    Java: jdk1.8.0_121 Tomcat: 7.0.94解壓後進入shiro-shiro-root-1.2.4/samples/web用IDEA加載,並設置pom.xml,指定jstl版本為1.2,增加commons-collections4,如下: <dependencies&
  • Apache Shiro反序化識別那些事
    1.1 關於Apache ShiroApache shiro是一個Java安全框架,提供了認證、授權、加密和會話管理功能,為解決應安全提供了相應的API:1.認證-用戶身份識別,常被稱為用戶」登錄」(理論上只要AES加密鑰洩,都會導致反序化)1.2.2 Shiro識別要想識別Apache Shiro反序列化漏,首先應該判斷相關的Web站點是否使shiro框架。
  • 披著小眾化外衣的shiro 如何做著「大眾化」生意?
    shiro就是在這塊美好的土地所誕生的品牌。公司於1989年所創立,2000年後才開始漸漸從土產轉換為護膚品。不過,品牌一開始並不叫shiro,先在2009年正式成立了品牌LAUREL之後,再在2015年決定進軍海外,才把名字改為shiro。
  • Spring Boot+Maven+JPA+Shiro+Easyui實現通用用戶權限管理系統
    項目描述日常工作中,權限管理是管理系統必不可少的功能。網絡上有各種各樣的權限管理系統,不過用別人的總不如自己寫一套來得踏實。之前本菜鳥分享的例子裡有各種技術點的分項實例,這次做一個綜合,形成自己的簡單通用的權限管理系統。
  • 山西空管分局進近管制室全力保障校驗飛行
    民航資源網2020年12月7日消息:2020年12月4日,一架飛行校驗中心的獎狀C680飛機抵達太原武宿國際機場。該機預計在12月5日至12月10日之間對太原機場ILS、NDB、燈光執行校驗任務,此次校驗飛行計劃校驗科目多,時間緊任務重,空域受限和管制調配難度較大是此次校飛工作的難點。山西空管分局進近管制室高度重視這次專項保障工作。校驗機組一落地,在機場集團牽頭下,空管、校驗機組及其他相關保障部門進行了校驗飛行協調會。
  • 德陽檢測設備檢測-儀器校驗
    德陽檢測設備檢測-儀器校驗儀器計量檢測第三方校準計量儀器校驗中心世通儀器校準計量檢測中心東莞市世通儀器檢測服務有限公司世通儀器計量校準校驗第三方認證機構總公司地址:廣東省東莞市道滘鎮厚德村上梁洲工業區四橫路7號聯繫人:韋楚婷
  • 無人機除了航拍,還可以校驗飛行
    殊不知,無人機還有我們日常不為所知的一項能力——飛行校驗。運輸機場作為航空運輸業最重要和核心的基礎保障設施,其在建設完成投入使用前,都需要對機場飛行程序、通信導航監視設備、儀表著陸系統和助航燈光等進行校驗飛行。中國民航飛行校驗中心作為我國唯一的民用航空飛行校驗機構,被譽為「開闢天路的人」,在全國範圍內200多座民航機場開展至少半年一次的飛行校驗工作。
  • 技術之一,鼎城區儀器檢定校驗機構:今日推薦
    鼎城區儀器檢定校驗機構:今日推薦    8.3.8 深圳市冠準科技有限公司(ATC)      (1)機構發展簡況分析      (2)機構發展規模分析      (3)機構檢測資質分析      (4)機構檢測範圍分析      (5)機構業務網絡分析      (6)機構研發投入分析      (7)機構發展優劣勢分析    8.3.9 浙江方圓檢測集團股份有限公司
  • layui中使用lay-verify進行條件校驗
    一、layui的校驗很簡單,主要有以下步驟:1. 在form表單內加上class="layui-form"2. 在提交按鈕上加上lay-submit3.在想要校驗的標籤,加上lay-verify=」」,在這個屬性裡,加上想要的值,就可以進行校驗了。
  • input輸入框如何快速進行規則校驗
    input輸入框是日常前端開發過程中經常會遇到的,輸入框是為了進行用戶交互,用戶提交或輸入數據,那麼在安全方面我們要做好把控工作,通常我們會制定規則來限制用戶輸入,在表單屬性之外的如何快速校驗呢?我們一起來看看吧!
  • 如何實現後臺管理系統的權限路由和權限菜單
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言本文是繼 前端如何一鍵生成多維度數據可視化分析報表 實戰的最後一篇文章, 主要介紹如何實現後臺管理系統的權限路由和權限菜單.
  • 首批賽斯納獎狀680A緯度飛行校驗構型投入使用
    中國航空新聞網訊:德事隆集團旗下德事隆航空近期交付了首批兩架飛行校驗任務構型的賽斯納獎狀680A緯度飛機,由兼松株式會社(Kanematsu Corporation)接收。飛機將由日本航空自衛隊(JASDF)自有運營,用於校驗日本空域的儀表進場程序和航路程序。第三架飛機預計於2021年初交付。
  • 美妝鑑定:徐璐安利同款shiro身體乳真假鑑定
    shiro身體乳是白色乳液狀質地,非常水潤,很好推開,一抹即被肌膚吸收了。使用之後不會感覺到粘膩,非常清爽,可以感覺到塗抹部位有一層薄薄的膜在保護肌膚。而且持香時間可長達 15 小時。接下來就分享幾個真假鑑定小知識。
  • Spring Boot集成validation用於優雅的校驗API參數的合法性
    validation主要是校驗用戶提交的數據的合法性,比如是否為空,密碼是否符合規則,郵箱格式是否正確等等,校驗框架比較多,用的比較多的是hibernate-validator, 也支持國際化,也可以自定義校驗類型的註解,這裡只是簡單的演示校驗框架在Spring Boot中的簡單集成