shiro快速入门

news2024/11/18 5:40:47

文章目录

      • 权限管理
        • 什么是权限管理?
        • 什么是身份认证?
        • 什么是授权?
      • 什么是shiro?
      • shiro的核心架构
        • shiro中的三个核心组件
      • shiro中的认证
      • shiro中的授权
      • shiro使用默认Ehcache实现缓存
      • shiro使用redis作为缓存实现

权限管理

什么是权限管理?

基本上涉及到用户参与的系统都需要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。

权限管理包括用户身份认证授权两部分,简称认证授权 ,对于需要访问控制的资源用户首先经过身份认证,认证过后用户具有该资源的访问权限即可访问。

什么是身份认证?

身份认证,就是判断一个用户是否为合法用户的处理过程,最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。对于采用指纹等系统,则出示指纹;对于硬件key等刷卡系统,则需要刷卡。

什么是授权?

授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的。

什么是shiro?

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证、权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。

shiro的核心架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LkhwGfkT-1690989234372)(/1594116621447.png)]

  • Subject(主体)
    当前与软件进行交互的实体(用户,第三方服务,计划任务等)的特定于安全性的“视图”。

  • SecurityManager(安全管理器)
    SecurityManager是Shiro体系结构的核心。它主要是一个“伞”对象,用于协调其托管组件以确保它们能够顺利协同工作。它还管理Shiro对每个应用程序用户的视图,因此它知道如何对每个用户执行安全性操作。

  • Authenticator(认证者)
    Authenticator是负责执行用户的身份验证(登录)并对其作出反应的组件。 当用户尝试登录时,该逻辑由身份验证器执行。 身份验证器知道如何与存储相关用户/帐户信息的一个或多个Realms协调。 从这些领域获得的数据用于验证用户的身份,以确保用户确实是他们所说的真实身份。

    • Authentication Strategy(身份验证策略)

      如果Realm配置了多个身份验证策略,则AuthenticationStrategy它将协调领域以确定身份验证尝试成功或失败的条件(例如,一个领域成功但其他领域失败) ,尝试是否成功?所有领域都必须成功吗?只有第一个?)。

  • Authorizer(授权者)
    授权者是负责确定应用程序中用户访问控制的组件。 它是最终表明是否允许用户做某事的机制。 与身份验证器一样,授权者也知道如何与多个后端数据源进行协调以访问角色和权限信息。 授权者使用此信息来确定是否允许用户执行给定的操作。

  • SessionManager(会话管理器)
    SessionManager知道如何创建和管理用户会话生命周期,以便为所有环境中的用户提供可靠的会话体验。 这是安全框架领域中的一项独特功能-Shiro能够在任何环境中本机管理用户会话,即使没有Web / Servlet或EJB容器也可以。 默认情况下,Shiro将使用现有的会话机制(例如Servlet容器)(如果可用),但是如果没有这种机制(例如在独立应用程序或非Web环境中),它将使用其内置的企业会话管理来 提供相同的编程经验。 SessionDAO的存在是为了允许使用任何数据源来保留会话。

    • SessionDAO
      SessionDAO代表SessionManager执行会话持久性(CRUD)操作。 这允许将任何数据存储插入会话管理基础结构。
  • CacheManager
    CacheManager创建和管理其他Shiro组件使用的Cache实例生命周期。 由于Shiro可以访问许多后端数据源以进行身份验证,授权和会话管理,因此缓存一直是框架中的一流架构功能,可以在使用这些数据源时提高性能。 可以将任何现代的开源和/或企业缓存产品插入Shiro,以提供快速有效的用户体验。

  • Cryptography(密码学)

    密码术是企业安全框架的自然补充。 Shiro的加密软件包包含易于使用和理解的加密密码,哈希(又名摘要)和不同编解码器实现的表示形式。 该软件包中的所有类都经过精心设计,以使其易于使用和理解。 使用Java的本机加密技术支持的任何人都知道,驯服它可能是具有挑战性的动物。 Shiro的加密API简化了复杂的Java机制,并使加密技术易于为普通凡人使用。

  • Realms(领域)
    如上所述,领域充当Shiro与您应用程序的安全数据之间的“桥梁”或“连接器”。 当真正需要与安全性相关的数据(例如用户帐户)进行交互以执行身份验证(登录)和授权(访问控制)时,Shiro会从一个或多个为应用程序配置的领域中查找许多此类内容。 您可以根据需要配置任意多个领域(通常每个数据源一个),并且Shiro会根据需要与它们进行协调,以进行身份验证和授权。

shiro中的三个核心组件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YDtmj89t-1690989234373)(/1594118706808.png)]

三个核心组件:Subject, SecurityManager 和 Realms.

Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。
  Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
  SecurityManager:它是Shiro框架的核心,典型的Facade(外观)模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
  Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
  从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。
  Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。

shiro中的认证

在这里插入图片描述

认证流程图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BjG0KVEO-1690989234374)(/1594118964312.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nQ0CTKKx-1690989234374)(/1594119924681.png)]

认证流程

  1. 系统调用subject主体的login(登录)方法将用户信息token(令牌-代表一定的身份)提交(请求)给SecurityManager对象(shiro安全框架的核心对象-负责调配各个组件-处理请求的入口)认证
  2. SecurityManager将认证操作委托给认证器对象Authenticator(认证管理器),认证管理器里有认证策略Authentication Strategy(认证方式),Authenticator将身份信息传递给Realm(完成数据的加载和封装)。
  3. Realm访问数据库获取用户信息然后对信息进行封装并返回给认证管理器Authenticator。
  4. Authenticator 对realm返回的信息进行身份认证(把用户输入的和数据库里查询到的信息做比对)。

shiro中的授权

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fCCNliYY-1690989234374)(/1594119807010.png)]

授权流程图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XccgvG9d-1690989234375)(/1594119368615.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lIOjnhrm-1690989234375)(/1594119873785.png)]

授权流程

  1. 系统调用subject主体对象相关方法将用户权限信息(例如isPermitted)递交给SecurityManager。
  2. SecurityManager将权限检测操作委托给Authorizer授权管理器对象。
  3. Authorizer授权管理器将用户信息委托给realm。
  4. Realm访问数据库获取用户权限信息(有没有权限,有什么样的权限)并封装。
  5. Authorizer对用户授权信息进行判定(判断用户访问资源时需要什么权限,假如用户所具有的权限包含这个资源访问时所需要的权限,那么用户就可以访问这个资源了)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tP8UIwEk-1690989234375)(/1594120003321.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r0uk7X5L-1690989234376)(/1594120222340.png)]

shiro使用默认Ehcache实现缓存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QqBFEv0T-1690989234376)(/1594120279192.png)]

本地缓存,每次断电重启,还是会查数据库

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-ehcache</artifactId>
    <version>1.5.2</version>
</dependency>
//3.创建自定义Realm
@Bean(name = "realm")   //指定别名
public Realm getRealm(){
    //创建密码匹配器
    HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
    //设置匹配算法
    matcher.setHashAlgorithmName("md5");
    //设置散列次数
    matcher.setHashIterations(1024);
    UserRealm realm = new UserRealm();
    realm.setCredentialsMatcher(matcher);

    //设置缓存,开启缓存管理器  EhCacheManager 是shiro提供的
    realm.setCacheManager(new EhCacheManager());
    //开启全局缓存
    realm.setCachingEnabled(true);
    //开启认证缓存
    realm.setAuthenticationCachingEnabled(true);
    //设置认证缓存的名字,不设置有默认名字
    realm.setAuthenticationCacheName("authenticationCache");
    //开启授权缓存
    realm.setAuthorizationCachingEnabled(true);
    //设置授权缓存的名字
    realm.setAuthorizationCacheName("authorizationCache");
    return realm;
}

shiro使用redis作为缓存实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/831422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从0到1学会手写操作系统,我只用了2个小时!!!

继《自己动手做一台计算机》 《嵌入式入门-模电基础》两大教程之后 黑马嵌入式教程再出力作 重磅发布第三弹 《自己动手写嵌入式操作系统》 问&#xff1a;嵌入式开发不是只学单片机就行&#xff1f;为什么要学操作系统&#xff1f; 答&#xff1a;年轻人&#xff0c;别把路…

LeetCode每日一题Day4——26. 删除有序数组中的重复项

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f433;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; …

Python 批量处理JSON文件,替换某个值

Python 批量处理JSON文件&#xff0c;替换某个值 直接上代码&#xff0c;替换key TranCode的值 New 为 Update。输出 cancel忽略 import json import os import iopath D:\\Asics\\850\\202307 # old path2 D:\\test2 # new dirs os.listdir(path) num_flag 0 for file…

采购分析:节省采购成本的 6 种方法

为了成功启动采购计划、稳定现金流并节省开支&#xff0c;企业需要了解从采购到付款的 P2P 周期的方方面面。 有远见的采购领导者将采购分析作为综合战略的一部分。因其有助于以简化和自动化的方式解决问题&#xff0c;从而更好地管理项目并节省大量成本。 什么是采购分析&am…

docker删除容器(步骤详解)

要在Docker中删除容器&#xff0c;需要使用命令docker rm。 下面是详细步骤&#xff1a; 1. 首先&#xff0c;使用docker ps命令查看当前正在运行的容器。这个命令会列出所有正在运行的容器的ID、名称、状态等信息。 如果没有正在运行的容器可以通过docker ps -a 查看当前所…

Java中的内存划分,一个数组的内存图

Java中的内存划分 Java的内存需要分成5个部分&#xff1a; 栈&#xff08;Stack&#xff09; 存放的都是 方法 中的 局部变量 。方法的运行一定要在栈当中运行。 局部变量&#xff1a;方法的参数&#xff0c;或者是方法{}内部的变量 作用域&#xff1a;一旦超出作用域&#xff…

Stable Diffusion教程(7) - PS安装AI绘画插件教程

配套教程视频&#xff1a;https://v.douyin.com/Uyux9F6/ 1. 前置条件 安装了stable diffusion 还没安装的从知识库安装 阿超的AI绘画知识库 语雀 安装了ps2023 还没安装的从网盘下载Win版 PS 2023【必须win10、11】.rar官方版下载丨最新版下载丨绿色版下载丨APP下载-12…

【雕爷学编程】MicroPython动手做(30)——物联网之Blynk

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

Uiautomation实现CSDN同步同页面文章至社区(2023.08.03更新)

目录 运行代码前须知&#xff1a; 前言 技能Get1 代码主体部分 写在最后 运行代码前须知&#xff1a; 1.本次更新的代码是实现C站内容管理整页文章&#xff08;20篇文章&#xff09;同步到所有社区&#xff0c;因此需要自己先Ctrl滚轮实现25%放缩&#xff0c;使得页面能将…

迭代器模式——遍历聚合对象中的元素

1、简介 1.1、概述 在软件开发时&#xff0c;经常需要使用聚合对象来存储一系列数据。聚合对象拥有两个职责&#xff1a;一是存储数据&#xff1b;二是遍历数据。从依赖性来看&#xff0c;前者是聚合对象的基本职责&#xff1b;而后者既是可变化的&#xff0c;又是可分离的。…

【MySQL】仓储模块,核对出入库流水

系列文章 C#底层库–MySQLBuilder脚本构建类&#xff08;select、insert、update、in、带条件的SQL自动生成&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129179216 C#底层库–MySQL数据库操作辅助类&#xff08;推荐阅读&#xff0…

在敏捷项目中如何做好资源规划?

敏捷项目管理是一种交付项目的迭代方法&#xff0c;主要用于软件开发项目。该方法由多个迭代或增量步骤组成&#xff0c;以实现最终目标。在敏捷的环境下工作&#xff0c;难免遇到以下这些情况&#xff1a; ● 人员和团队通常必须将时间分配到不同的项目上。 ● 敏捷和非敏捷工…

【Linux】创建与删除用户

新增用户&#xff1a; adduser 用户名【添加用户】 passwd 用户名【设置用户密码】删除用户&#xff1a; userdel -r 用户名【删除用户】

字段填充策略 FieldFill

实体类中有如下属性&#xff0c;通过上面的自动填充属性&#xff0c;我们可以实现在进行插入&#xff08;insert&#xff09;操作时对添加了注解TableField(fill FieldFill.INSERT)的字段进行自动填充&#xff08;解释&#xff1a;后面会写配置自动填充的配置类&#xff0c;该…

举个栗子~Quick BI 技巧(2):创建柱线组合图

上一期举个栗子为数据粉们分享了如何简单几步创建趋势折线图&#xff0c;有一些数据粉发来疑问&#xff1a;如何利用 Quick BI 制作柱线图呢&#xff1f; 线柱图是一种非常重要且常用的组合图表&#xff0c;可以将两组数据在同一个表中直观的表达。今天的栗子&#xff0c;我们…

《吐血整理》高级系列教程-吃透Fiddler抓包教程(25)-Fiddler如何优雅地在正式和测试环境之间来回切换-下篇

1.简介 在开发或者测试的过程中&#xff0c;由于项目环境比较多&#xff0c;往往需要来来回回地反复切换&#xff0c;那么如何优雅地切换呢&#xff1f;宏哥今天介绍几种方法供小伙伴或者童鞋们进行参考。 2.实际工作场景 2.1问题场景 &#xff08;1&#xff09;已发布线上…

【微信小程序】van-uploader实现文件上传

使用van-uploader和wx.uploadFile实现文件上传&#xff0c;后端使用ThinkPHP。 1、前端代码 json&#xff1a;引入van-uploader {"usingComponents": {"van-uploader": "vant/weapp/uploader/index"} }wxml&#xff1a;deletedFile是删除文件函…

React入门学习笔记2

jsx语法规则 定义虚拟DOM时&#xff0c;不要写引号。标签中混入JS表达式时要用{ }。样式的类名指定不要用class&#xff0c;要用className。内联样式&#xff0c;要用style{{key&#xff1a;value}}的形式去写。只有一个根标签标签必须闭合标签首字母 )若小写字母开头&#xf…

C语言技巧 ----------调试----------程序员必备技能

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; &#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382;…

pytorch中torch.einsum函数的详细计算过程图解

第一次见到 rel_h torch.einsum(“bhwc,hkc->bhwk”, r_q, Rh)这行代码时&#xff0c;属实是懵了&#xff0c;网上找了很多博主的介绍&#xff0c;但都没有详细的说明函数内部的计算过程&#xff0c;看得我是一头雾水&#xff0c;只知道计算结果的维度是如何变化的&#xf…