深入浅出 Spring Boot 与 Shiro:构建安全认证与权限管理框架

一、Shiro框架概念

(一)Shiro框架概念

1.概念:

  • Shiro是apache旗下一个开源安全框架,它对软件系统中的安全认证相关功能进行了封装,实现了用户身份认证,权限授权、加密、会话管理等功能,组成一个通用的安全认证框架。
  • 工作流程如下图所示:

2.Shiro框架的三大组件:

  • Subject:主体对象,用于提交用户认证和授权作息。
  • SecurityManager:安全管理器,负责认证、授权等业务实现。(程序员需要配置该类)
  • Realm:领域对象,负责从数据层获取业务数据。(需要程序员提供Shiro框架定义的抽象类AuthorizingRealm(授权Realm)或AuthenticatingRealm(认证Realm)。
  • 三大组件工作流程

3.Shiro框架的相关组件具体作用:

  • Shiro框架进行权限管理时,涉及了一些核心对象,主要包括:认证管理对象,授权管理对象,会话管理对象,缓存管理对象,加密管理对象以及Realm管理对象等。
    • 具体架构如图所示:

  • 核心对象具体作用:
  • Subject:与软件交互的一个特定的实体(用户、第三方服务等)。
  • SecurityManager:Shiro的核心,用来协调管理组件工作。
  • Authenticator:负责认证操作。
  • Authorizer:负责授权检测。
  • SessionManager(会话管理):负责创建并管理用户Session生命周期。
  • SessionDao:代表SessionManager执行Session持久(CRUD)操作,它允许任何存储的数据挂接到Session管理基础上。
  • CacheManager:提供创建缓存实例和管理缓存生命周期的功能。
  • Cryptography(加密管理器):提供了加密方式的设计及管理。
  • Realm(领域对象):是Shiro和应用程序安全数据的桥梁。

二、SpringBoot整合Shiro

(一)所需依赖

<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-web-starter</artifactId><version>1.7.1</version>
</dependency>

1.当添加该依赖后需要对项目进行初始化否则项目会启动失败。

原因:添加该依赖启动项目时,Shiro框架会要求创建一个Realm对象并交给Spring框架管理。

(二)完成Shiro配置

1.在application.yml/application.properties文件中

shiro:loginUrl: /login

(三)完成Shiro框架整合

  • 提供Realm的实现类:
    • Realm定义与实现结构及提供Realm实现类的方式

  • 具体实现过程:
    • 提供Realm的具体实现类SysShiroRealm.
      • 将SysShiroRealm对象交给Spring管理。如下图:

    三、通过Shiro框架认证实现

    (一)配置认证过滤链

    1.实现方法:

    • 配置一个ShiroFilterChainDefinition的实现类DefaultShiroFilterChainDefinition对象,在该对象中配置具体过滤链。完成配置后将该对象交于Spring管理。

    2.具体实现:

    @Bean
    public ShiroFilterChainDefinition shiroFilterChainDefinition()
    {DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();chainDefinition.addPathDefinition("/login", "anon");chainDefinition.addPathDefinition("/assets/**", "anon");chainDefinition.addPathDefinition("/forgetpw", "anon");chainDefinition.addPathDefinition("/user/logininfo", "anon");chainDefinition.addPathDefinition("/logout", "logout");/*chainDefinition.addPathDefinition("/**", "authc");*/return chainDefinition;
    }
    • 细节如下图所示

    (二)提交用户登录信息给Shiro框架的securityMananger。

    实现方法:通过Subject对象调用login()方法实现。

    第一步:从前端获取用户信息通过Ajax或Axios提交给controller

    第二步:controller获取前端提供的用户登录信息,并封装成UsernamePasswordToken做为参数传递给Subject对象。Subject对象调用login方法将用户登录信息提交给SecurityManager进行登录校验。具体如下图:

    (三)数据库获取用户认证信息交给Shiro框架的SecurityManager。

    实现方法:通过重写doGetAuthenricatingInfo()实现

    第一步:向SecurtiyManager提供用户凭证加密方式:

    • 原因:
      • 由于通过Subject的login方法传给SecurityManager的用户的密码为明文密码,而数据库中保存的是加密盐和加密密码,因此需要提供加密方法,供SecurityManager调用对明文密码进行加密操作完成与加密后的密码校验。
    • 方法:
      • 提供加密方法需要重写AuthorizingReaml的方法getCredentialsMatcher方法,该方法返回一个CredentialsMatcher(凭证匹配器)的实现类HashedCredentialsMatcher(针对MD5加密)的对象。
    • 具体实现:

    第二步:重写认证方法doGetAuthenticatingInfo方法,返回一个AuthenticationInfo的实现类SimpleAuthenticationInfo对象。用于封装数据库中用户凭证信息。

    • 目的:封装从数据库获取的用户凭证信息,用于SecurityManager认证操作。
    • 具体实现:
        • 其中:SimpleAuthenticationInfo对象的构造方法:如图所示。

    (四)完成认证

    • 由SecurityManager内部完成,无需程序员干预。

    (五)对认证结果进行处理。

    1.SecurityMananger认证结果:

    • 用户不存在:SecurityManager抛出UnknowAccountException。
    • 密码不匹配:SecurityManager抛出IncorrectCredetialsException。
    • 账号锁定:SecurityManager抛出LockedAccountException。

    2.通过全局异常处理类完成认证结果信息普通化:

    (六)获取用户登陆信息

    1.方法:

    • 通过shiro框架的subject组件获取。

    2.具体实现:

    • SysUsersPojo usersPojo = (SysUsersPojo) SecurityUtils.getSubject().getPrincipal();

    四、通过Shiro框架实现授权

    (一)实现授权的方式

    • Shiro框架实现授权是通过AOP的方式实现的。
      • 底层通过@annontation切入点表达式来定义切点。
        • 自定义的Annontation为@RequiresPremissions。
        • 注解实参:自定义的授权标识标识。
          • 作用:用于标识访问该方法需要的权限。
        • 目标方法是需要授权才能访问的方法。
        • 具体使用方法:

    (二)授权的前置依赖

    • 由于Shiro框架的授权是通过AOP来实现的,因此,要实现Shiro授权,就必须在项目中添加SpringAop依赖。
    • 即:
      • <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

    (三)授权实现流程

    1.认证是授权的基础。

    2.实现流程

    • 当用户访问需要授权的资源时,SecurityManager调用Realm中的doGetAuthorizationInfo()方法。
    • 该方法从用户认证信息中获取用户信息。
    • 通过用户信息获取用户所拥有的所有授权信息,封装成AuthorizationInfo实现类的对象。
    • SecurityManager内部完成授权信息校验。
      • 如果用户拥有该授权标识,则访问该方法;如果用户没有该授权标识,则SecurityManager出抛出AuthorizationEexception,终止访问。

    (四)具体实现过程

    1.使用@RequiresPermissions描述需要授权才能访问的方法。

    2.重写Realm中的doGetAuthorizationInfo方法,用于封装数据库的保存的该用户拥有的所有授权标识以供SecurityManager授权校验时使用。

    3.授权中可能存在的问题

    • 存在问题:当使用@RequiresPermissions注解描述需要授权访问的Controller层方法时,导致该方法无法被访问。
    • 产生原因:
      • Shiro框架实现授权是通过AOP的方式实现。
      • 当@RequiresPermissions描述目标方法时,Shiro会为该方法所在类创建一个CGLIB代理对象。
      • 在创建代理对象时,默认情况下,原Controller方法上的@RequestMapping等类似注解失效。导致无法访问该Controller方法。
    • 解决方法:
      • 解决原理:
        • AOP创建代理对象是通过DefaultAdvisorAutoProxyCreator对象完成的。
      • 解决方法:
        • 修改DefaultAdvisorAutoProxyCreator对象配置,让原对象上注解生效。
      • 具体实现。

    五、认证授权总结

    (一)用户信息流转流程

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重学SpringBoot3-整合 Elasticsearch 8.x (一)客户端方式

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 这里写目录标题 1. 为什么选择 Elasticsearch&#xff1f;2. Spring Boot 3 和 Elasticsearch 8.x 的集成概述2.1 准备工作2.2 添加依赖 3. Elasticsearch 客户端配置方式…

MyBaitsPlus 基本用法简单整理

MyBaitsPlus 基本用法整理 查询单表查询查询单条数据写法一&#xff1a;&#xff08;this.getOne&#xff09;写法二&#xff1a;&#xff08;XxxMapper.selectById&#xff09;写法三&#xff1a;&#xff08;this.getById&#xff09; 查询 list 集合&#xff08;this.list&a…

基于MATLAB的战术手势识别

手势识别的研究起步于20世纪末&#xff0c;由于计算机技术的发展&#xff0c;特别是近年来虚拟现实技术的发展&#xff0c;手势识别的研究也到达一个新的高度。熵分析法是韩国的李金石、李振恩等人通过从背景复杂的视频数据中分割出人的手势形状&#xff0c;然后计算手型的质心…

Mac 配置SourceTree集成云效

1、背景 工作使用的是自己的笔记本&#xff0c;一个是比较卡&#xff0c;在一个是敏感信息比较多还是使用公司的电脑&#xff0c;但是系统是Mac就很麻烦&#xff0c;在网上找了帖子记录一下 2、配置 打开终端 ssh-keygen -t rsa #一直回车就行 cd .ssh cat id_rsa.pub #查…

【快速上手】pyspark 集群环境下的搭建(Yarn模式)

目录 前言&#xff1a; 一、安装步骤 安装前准备 1.第一步&#xff1a;安装python 2.第二步&#xff1a;在bigdata01上安装spark 3.第三步&#xff1a;同步bigdata01中的spark到bigdata02和03上 二、启动 三、可打开yarn界面查看任务 前言&#xff1a; 上一篇介绍的是…

使用Python多线程抓取某图网数据并下载图片

前言 在互联网开发领域&#xff0c;数据抓取是一项非常实用的技术。通过数据抓取&#xff0c;我们可以从网页上获取所需的信息&#xff0c;并将其转化为结构化数据&#xff0c;以便进一步分析或使用。本文将介绍如何利用Python编写一个多线程程序来抓取网页上的图片数据&#…

《IMM交互式多模型滤波MATLAB实践》专栏目录,持续更新……

专栏链接&#xff1a;https://blog.csdn.net/callmeup/category_12816762.html 专栏介绍 关于IMM的例程 双模型EKF&#xff1a; 【逐行注释】基于CV/CT模型的IMM|MATLAB程序|源代码复制后即可运行&#xff0c;无需下载三模型EKF&#xff1a; 【matlab代码】3个模型的IMM例程&…

鸿蒙开发案例:指南针

【1】引言&#xff08;完整代码在最后面&#xff09; 在本文中&#xff0c;我们将介绍如何使用鸿蒙系统&#xff08;HarmonyOS&#xff09;开发一个简单的指南针应用。通过这个案例&#xff0c;你可以学习如何使用传感器服务、状态管理以及UI构建等基本技能。 【2】环境准备 …

人工智能的发展与未来:从Yann LeCun的观点谈起

引言 在当今的人工智能&#xff08;AI&#xff09;领域&#xff0c;AGI&#xff08;通用人工智能&#xff09;已成为热门话题。许多专家认为&#xff0c;随着技术的不断发展&#xff0c;AGI的实现只是时间问题。然而&#xff0c;Yann LeCun——图灵奖得主、Meta首席AI科学家&a…

【The Art of Unit Testing 3_自学笔记06】3.4 + 3.5 单元测试核心技能之:函数式注入与模块化注入的解决方案简介

文章目录 3.4 函数式依赖注入技术 Functional injection techniques3.5 模块化依赖注入技术 Modular injection techniques 写在前面 上一篇的最后部分对第三章后续内容做了一个概括性的梳理&#xff0c;并给出了断开依赖项的最简单的实现方案&#xff0c;函数参数值注入法。本…

电磁兼容(EMC):整改案例(六)Y电容过大导致雷击浪涌炸机

目录 1. 异常现象 2. 原因分析 3. 整改方案 4. 总结 1. 异常现象 某金属外壳带接地线的产品按GB/T 17626.5进行雷击浪涌测试&#xff0c;在L&#xff0c;N线对PE进行4kV浪涌电压测试时&#xff0c;出现炸机现象&#xff0c;AC-DC电源芯片损坏。而在L&#xff0c;N线间进行2…

代码之眼,陈欣的xml解密之路

第一章 在未来的世界里&#xff0c;科技已经发展到了令人难以想象的地步。人工智能、量子计算和生物技术交织在一起&#xff0c;创造了一个全新的社会形态。在这个世界中&#xff0c;有一个名为“代码守护者”的组织&#xff0c;专门负责维护全球信息系统的安全和稳定。 陈欣是…

L0G1000:Linux+InternStudio 闯关作业

1. 配置基础环境 首先&#xff0c;打开 Intern Studio 界面&#xff0c;点击 创建开发机 配置开发机系统。 InternStudio 填写 开发机名称 后&#xff0c;点击 选择镜像 使用 Cuda11.7-conda 镜像&#xff0c;然后在资源配置中&#xff0c;使用 10% A100 * 1 的选项&#xff…

爬虫笔记22——当当网图书详情页静、动态数据爬取

当当网动态数据爬取 静态数据爬取动态数据爬取接口参数的获取 静态数据爬取 进入图书详情&#xff0c;这里的图书数据信息比如标题、价格、图片都是非结构化数据&#xff0c;可以使用xpath语法提取。是很简单的数据采集了&#xff0c;就不细说了。 动态数据爬取 滑到下面这里的…

使用pathview在线渲染KEGG Pathway Map,给感兴趣的基因、化合物添加颜色

导读&#xff1a; 通过将用户提供的基因表达定量数据&#xff0c;化合物定量数据映射并渲染到相关的KEGG通路图上&#xff0c;能够帮助我们直观且系统地研究基因、酶、化合物间的关系。 KEGG通路图简介 KEGG PATHWAY数据库是一系列手动绘制的图形图谱的集合&#xff0c;称为…

自动化测试工具Ranorex Studio(二十一)-适配一个已存在的对象库

通过录制一个手工测试场景我们创建了一个对象库。录制期间用到的每个UI元素都在库中创建了一个新的条目。默认情况下&#xff0c;一个新的Ranorex Studio项目包含一个库文件(*.rxrep)&#xff0c;这个文件可以被多个录制模块或代码模块使用。 图&#xff1a;一个库的文件视图…

OpenSLL下载,环境变量配置

https://slproweb.com/products/Win32OpenSSL.html 环境变量 新建一个path为安装选择的目录的bin路径

【MyBatis】【基于轻量型架构的WEB开发】课程 课后习题 章节测试

mybatis关联查询、缓存、注解 一. 单选题 1. 下列关于 <collection> 元素的描述正确的是&#xff08;&#xff09;。 A. MyBatis 就是通过 <collection> 元素来处理一对多关联关系的 B. <collection> 元素的属性与 <association> 元素完全相同 C.…

JavaEE-多线程上

文章目录 线程概述进程/线程多线程的作用JVM关于线程资源的规范关于Java程序的运行原理 并发与并行并发(concurrency)并行(parallellism)并发编程与并行编程 线程的调度策略分时调度模型抢占式调度模型 创建线程线程类分析入门实现线程的第一种方式实现线程的第二种方式 线程的…

SQL 常用语句

目录 我的测试环境 学习文档 进入数据库 基础通关测验 语句-- 查 展示数据库&#xff1b; 进入某个数据库&#xff1b; 展示表&#xff1a; 展示某个表 desc 查询整个表&#xff1a; 查询特定列&#xff1a; 范围查询 等于特定值 不等于 介于 特定字符查询 Li…