当前位置: 首页 > news >正文

深入浅出 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对象配置,让原对象上注解生效。
      • 具体实现。

    五、认证授权总结

    (一)用户信息流转流程

相关文章:

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

一、Shiro框架概念 &#xff08;一&#xff09;Shiro框架概念 1.概念&#xff1a; Shiro是apache旗下一个开源安全框架&#xff0c;它对软件系统中的安全认证相关功能进行了封装&#xff0c;实现了用户身份认证&#xff0c;权限授权、加密、会话管理等功能&#xff0c;组成一…...

外包干了三年,精神严重内耗...

前段时间我同事&#xff08;做测试的一个妹子&#xff09;跟我讲&#xff0c;感觉早上起来十分的疲惫&#xff0c;不想上班&#xff0c;问我们这是什么样的现象&#xff0c;其实有时候我也有这种感觉&#xff0c;虽然我卷&#xff0c;但我也是肉体凡胎啊&#xff01;不是机器人…...

ruoyi-vue集成tianai-captcha验证码

后端代码 官方使用demo文档&#xff1a;http://doc.captcha.tianai.cloud/#%E4%BD%BF%E7%94%A8demo 我的完整代码&#xff1a;https://gitee.com/Min-Duck/RuoYi-Vue.git 主pom.xml 加入依赖 <!-- 滑块验证码 --><dependency><groupId>cloud.tianai.captc…...

Django安装

在终端创建django项目 1.查看自己的python版本 输入对应自己本机python的版本&#xff0c;列如我的是3.11.8 先再全局安装django依赖包 2.在控制窗口输入安装命令&#xff1a; pip3.11 install django 看到Successflully 说明我们就安装成功了 python的Scripts文件用于存…...

Ubuntu 20.04 安装 QGC v4.3 开发环境

Ubuntu 20.04 安装 QGC开发环境 1. 准备安装 Qt 5.15.2安装依赖获取源码 2. 编译参考 前言 QGC ( QGroundControl) 是一个开源地面站&#xff0c;基于QT开发的&#xff0c;有跨平台的功能。可以在Windows&#xff0c;Android&#xff0c;MacOS或Linux上运行。它可以将PX4固件加…...

WPF+MVVM案例实战(二十一)- 制作一个侧边弹窗栏(AB类)

文章目录 1、案例效果1、侧边栏分类2、AB类侧边弹窗实现1.文件创建2、样式代码与功能代码实现3、功能代码实现 3 运行效果4、源代码获取 1、案例效果 1、侧边栏分类 A类 &#xff1a;左侧弹出侧边栏B类 &#xff1a;右侧弹出侧边栏C类 &#xff1a;顶部弹出侧边栏D类 &#xf…...

linux中怎样登录mysql数据库

在Linux中登录MySQL数据库&#xff0c;可以使用以下命令&#xff1a; mysql -u username -p 其中&#xff0c;username是你的MySQL用户名。运行该命令后&#xff0c;系统会提示你输入密码。 如果MySQL服务器不在本地主机或者你需要指定不同的端口&#xff0c;可以使用以下命…...

深入理解 Linux 内存管理:free 命令详解

在 Linux 系统中&#xff0c;内存是关键的资源之一&#xff0c;管理和监控内存的使用情况对系统的稳定性和性能至关重要。free 命令是 Linux 中用于查看内存使用情况的重要工具&#xff0c;它可以让我们快速了解系统中物理内存和交换分区&#xff08;Swap&#xff09;的使用状态…...

指针万字超级最强i解析与总结!!!!!

文章目录 1.内存和地址1.1内存1.2究竟该如何理解编址 2.指针变量和地址2.1 取地址操作符&#xff08;&&#xff09;2.2指针变量和解引用操作符&#xff08;*&#xff09;2.2.1指针变量2.2.2如何拆解指针类型2.2.3解引用操作符 2.3 指针变量的大小 3.指针变量类型的意义3.1指…...

告别生硬电子音,这款TTS软件让语音转换更自然动听

Balabolka是一款革新性的文本语音转换工具&#xff0c;为用户提供了极其灵活和个性化的阅读体验。这款软件不仅仅是简单的文字朗读器&#xff0c;更是一个智能的语音助手&#xff0c;能够将各类文本瞬间转化为生动自然的语音输出。 软件的核心优势在于其卓越的文件兼容性和多样…...

CORS(跨域资源共享)和SOP(同源策略)

CORS&#xff08;跨域资源共享&#xff09;和SOP&#xff08;同源策略&#xff09;不是同一个东西&#xff0c;但它们紧密相关&#xff0c;并且常常一起讨论&#xff0c;因为 CORS 是为了解决同源策略带来的跨域问题而引入的。 同源策略&#xff08;Same-Origin Policy&#x…...

【系统设计】数据库压缩技术详解:从基础到实践(附Redis内存优化实战案例)

概述 在现代数据库系统中&#xff0c;压缩技术对于提高存储效率和加速查询性能至关重要。特别是在处理大规模数据时&#xff0c;压缩能够极大地减少存储空间&#xff0c;并优化查询性能。本文将总结几种常见的压缩方式&#xff0c;并通过详细的解释和示例清晰地展示每种压缩方…...

基于SpringBoot的“乐校园二手书交易管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“乐校园二手书交易管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 用户注册界面图 二手…...

debian11安装最新rabbitmq

1、使用官网提供系统对应的安装脚本 安装 版本说明&#xff1a; Debian Buster代表Debian 10 Debian Bullseye代表Debian 11 Debian Bookworm代表Debian 12 ‌Debian Trixie代表Debian 13 Debian Sid代表Debian unstable版本 2、新建脚本文件 vim rabbitMq.sh将脚本内容复制到…...

三十三、Python基础语法(面向对象其他语法-下)

一、属性划分 1.类属性 类属性&#xff1a;类属性就是类对象具有的属性&#xff0c;一般写法在类内部、方法的外部定义的变量,就是类属性&#xff0c;类属性在内存中只有一份。可以通过类名直接访问&#xff0c;也可通过实例访问。 class Circle:# 类属性&#xff0c;定义圆…...

简单又便宜的实现电脑远程开机唤醒方法

现有的远程开机方案 1&#xff09;使用向日葵开机棒 缺点是比较贵一点&#xff0c;开机棒要一百多&#xff0c;而且查了评论发现挺多差评说不稳定&#xff0c;会有断联和无法唤醒的情况&#xff0c;而且设置也麻烦&#xff0c;还需要网卡支持WOL 2&#xff09;使用远程开机卡 …...

Flutter鸿蒙next 状态管理框架对比分析

在 Flutter 开发中&#xff0c;状态管理是一个非常重要且关键的主题。Flutter 中的应用状态管理直接影响着应用的性能、可维护性和开发效率。随着 Flutter 生态的成熟&#xff0c;已经出现了许多不同的状态管理方案&#xff0c;各具特色&#xff0c;适用于不同的开发场景。本文…...

Vue Router进阶详解

导航守卫 若依框架登录鉴权详解&#xff08;动态路由&#xff09;_若依鉴权-CSDN博客 完整的导航解析流程 导航被触发&#xff1a; 当用户点击页面中的链接、使用编程式导航&#xff08;如router.push或router.replace&#xff09;或手动输入URL时&#xff0c;导航流程被触发。…...

进程的控制

进程 task_struct mm_struct(虚拟地址空间) 页表 代码和数据 。 新建进程先有管理系统&#xff0c;然后才有代码和数据。 fork()函数&#xff1a;子进程返回0&#xff0c;父进程返回的是子进程的pid - - - 方便父进程对子进程标识。 进程终止&#xff1a;释放代码和数据占…...

基于C语言实现的图书管理系统

使用Visual Studio 2022编译工具进行编写代码的。 项目源码直接奉上: book1.h头文件: #ifndef __BOOK1_H //预处理用于条件编译 避免头文件反复包含 #define __BOOK1_H#include<stdio.h> #include <string.h> #include<stdlib.h> #include<stdbool.h&g…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...