若依框架中SpringSecurity的实现流程

news2024/11/24 13:23:32

文章目录

  • Spring Security
    • 概述
    • 核心
    • 原理
  • 若依Sprint Security分析
    • 配置类分析
    • 流程分析图
    • 过滤器分析
  • 若依登录/退出流程
    • 流程图
    • 登录
    • 退出


写在开头: 本篇博客与核桃共同完成

Spring Security

概述

Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架,用于保护基于Spring的应用程序的实际标准

核心

认证(Authentication):验证当前访问系统的是不是本系统用户,确定具体用户信息
授权(Authorization):经过认证后判断当前用户是否有权限进行指定操作

原理

图片分析来源于此人的博客 https://muggle.javaboy.org/
Spring Security 采用的是责任链的设计模式,它有一条很长的过滤器链。
大致了解一下每个链对应的功能:

  • WebAsyncManagerIntegrationFilter:将 安全上下文与 Spring Web 中用于处理异步请求映射的 WebAsyncManager 进行集成。
  • SecurityContextPersistenceFilter:在每次请求处理之前将该请求相关的安全上下文信息加载到 SecurityContextHolder 中,然后在该次请求处理完成之后,将 SecurityContextHolder 中关于这次请求的信息存储到一个“仓储”中,然后将 SecurityContextHolder 中的信息清除,例如在Session中维护一个用户的安全信息就是这个过滤器处理的。
  • HeaderWriterFilter:用于将头信息加入响应中。
  • CsrfFilter:用于处理跨站请求伪造。
  • LogoutFilter:用于处理退出登录。
  • UsernamePasswordAuthenticationFilter:用于处理基于表单的登录请求,从表单中获取用户名和密码。默认情况下处理来自 /login 的请求。从表单中获取用户名和密码时,默认使用的表单 name 值为 username 和 password,这两个值可以通过设置这个过滤器的usernameParameter 和passwordParameter 两个参数的值进行修改。
  • DefaultLoginPageGeneratingFilter:如果没有配置登录页面,那系统初始化时就会配置这个过滤器,并且用于在需要进行登录时生成一个登录表单页面。
  • BasicAuthenticationFilter:检测和处理 http basic 认证。
  • RequestCacheAwareFilter:用来处理请求的缓存。
  • SecurityContextHolderAwareRequestFilter:主要是包装请求对象request。
  • AnonymousAuthenticationFilter:检测 SecurityContextHolder 中是否存在 Authentication 对象,如果不存在为其提供一个匿名 Authentication。
  • SessionManagementFilter:管理 session 的过滤器
  • ExceptionTranslationFilter:处理 AccessDeniedException 和 AuthenticationException 异常。
  • FilterSecurityInterceptor:可以看做过滤器链的出口。
  • RememberMeAuthenticationFilter:当用户没有登录而直接访问资源时, 从 cookie 里找出用户的信息, 如果 Spring Security 能够识别出用户提供的remember me cookie, 用户将不必填写用户名和密码, 而是直接登录进入系统,该过滤器默认不开启。
    在这里插入图片描述

若依Sprint Security分析

配置类分析

若依的核心配置类都放在ruoyi-framework模块下,项目启动时加载配置文件。

  • @EnableGlobalMethodSecurity 注解用于开启 Spring 方法级安全,并且声明该类为一个配置类。

这个注解提供了prePostEnabled(常用)、securedEnabled 和 jsr250Enabled 三种不同的机制来实现同一种功能。
prePostEnabled = true 会解锁 @PreAuthorize 和 @PostAuthorize 两个注解,分别是在方法执行前进行验证和在方法执行后进行验证。
@Secured 注解是用来定义业务方法的安全配置。在需要安全[角色/权限等]的方法上指定 @Secured,并且只有那些角色/权限的用户才可以调用该方法。但是这个注解不支持Spring EL表达式,不够灵活。

在这里插入图片描述
在这里插入图片描述

  • 要接管Spring Security 的配置,则需要继承WebSecurityConfigurerAdapter这个抽象类,重写相关的方法

configure(HttpSecurity httpSecurity) 方法中添加过滤器链

在这里插入图片描述
在这里插入图片描述

流程分析图

在这里插入图片描述

过滤器分析

在这里插入图片描述

  • logout 过滤器(用于账号登出功能)
    指定登出的url和处理类
    自定义退出处理类LogoutSuccessHandlerImpl,需继承LogoutSuccessHandler接口,重写onLogoutSuccess()方法对用户的缓存记录和退出信息进行处理
    在这里插入图片描述
  • cors 过滤器
    完整的CORS说明详见: https://www.w3.org/TR/cors/。
    其中跨域请求添加两次,为了保证能处理跨域情况,实际添加一次在Logout过滤器链前即可。实际就是设置允许跨域的请求
    在这里插入图片描述
  • jwt 过滤器
    添加了一个jwt过滤器在用户的账号密码认证前,(用于判断是否存在token),该类又继承了OncePerRequestFilter抽象类(保证一次外部请求,只执行一次过滤方法),用于处理在输入用户名密码前对存在携带的token进行校验是否过期等等,如果token校验成功,那么就会自动读取token中的用户名密码信息,并且设置到对应的安全上下文中,最后放行该次请求(不做对用户名密码校验的处理)
    在这里插入图片描述
    如果没有携带token就需要进行下一个UsernamePasswordAuthenticationFilter用户名密码过滤器处理,该过滤器是将用户名密码读取出来,然后设置到SecurityContextHolder的安全上下文内容中
    在这里插入图片描述
    最后的认证是通过认证管理器来实现最后的认证功能
    在这里插入图片描述
    对于认证失败,不会跳到认证失败处理器,而是直接抛出自定义异常,通过全局的异常处理器来处理认证失败的逻辑
    在这里插入图片描述
    认证错误异常
    在这里插入图片描述

若依登录/退出流程

流程图

在这里插入图片描述

登录

  • 登录按钮点击,通过this.$store.dispatch调用store 里的user.js中的login方法,login方法调用封装的login方法,发送请求到后端

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 在SysLoginController中定义登录接口,并且在SecurityConfig中直接放行/login路径,请求该接口会校验用户名和密码,然后再loginService的login方法中读取用户名和密码交给认证管理器认证,成功后设置认证后的用户信息到token中,返回一个token
    在这里插入图片描述
    在这里插入图片描述

退出

  • 退出登录点击,通过this.$store.dispatch调用store 里的user.js中的logout方法,logout方法调用封装的logout方法,发送请求到后端
    在这里插入图片描述
    在这里插入图片描述
  • 后端对退出登录的url进行拦截,调用退出登录处理器进行用户退出信息处理
    在这里插入图片描述
    在这里插入图片描述

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

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

相关文章

go微信开发sdk-简单使用_已设置图床

go微信开发sdk-简单使用 GitHub - silenceper/wechat: WeChat SDK for Go (微信SDK:简单、易用) 使用的sdk为上述的,这边给出快速的项目实例 git clone https://github.com/gowechat/example.git简单的项目结构 这边简单用dock…

多线程锁的升级原理是什么

在 Java 中,锁共有 4 种状态,级别从低到高依次为:无状态锁,偏向锁,轻量级锁和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级。 多线程锁锁升级过程 如下图所示 多线程锁的升级过程…

数字孪生技术:城市交通的智能引领

城市交通问题一直是我们日常生活中的头等大事。交通拥堵、公共交通不便、环境污染等问题常常困扰着城市居民。然而,数字孪生技术正以令人兴奋的方式改变着城市交通的面貌,为城市交通带来了新的变化。 实时交通监测:数字孪生技术通过网络连接的…

动态规划:“以宇换宙”的优雅工艺

Those who do not remember the past are condemned to repeat it. 那些不能铭记历史的人注定要重蹈覆辙。 在动态规划——经典案例分析中我们提到了斐波那契数列的求解思路。知道动态规划的主要优点是能够在解决问题时避免重复计算,通过利用已经计算过的结果来加速…

Java实现Web的ashx对接ORM

之前的介绍已经实现了ORM的主体和Web的调用结构主题,那么这次把Web和LIS.Core的容器和ORM做对接,通过ashx实现的业务类测试调用ORM查询数据。 首先改造容器让传入根地址 package LIS.Core.Context;import org.w3c.dom.Document; import org.w3c.dom.El…

单例模式-懒汉式双重锁机制

正是因为担心并发问题,才在双重检查锁模式中的synchronized内部进行了再次判断 tnull。 在第一次判断 tnull 之后,当多个线程同时通过这个检查,其中一个线程会获得锁并创建实例。然而,其他线程在此期间可能会继续等待锁释放&…

ViT Vision Transformer超详细解析,网络构建,可视化,数据预处理,全流程实例教程

关于ViT的分析和教程,网上又虚又空的东西比较多,本文通过一个实例,将ViT全解析。 包括三部分内容,网络构建;orchview.draw_graph 将网络每一层的结构与输入输出可视化;数据预处理。附完整代码 网络构建 …

【Code Reading】Transformer in vision and video

文章目录 1. vit2. Swin-t3. vit_3D4. TimeSformer First🚀🚀5. vivit 1. vit 详细解释 在论文的Table1中有给出三个模型(Base/ Large/ Huge)的参数,在源码中除了有Patch Size为16x16的外还有32x32的。其中的Layers就…

基于MIMO通信系统的球形译码算法matlab性能仿真,对比PSK检测,SDR检测

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 ................................................................ for i1:length(SNR) Bit…

SpringCloud(六) Nacos配置管理

Nacos除了可以做注册中心,同样可以做配置管理来使用; Nacos做注册中心的使用和注意事项详看:SpringCloud(四) Nacos注册中心-CSDN博客 目录 一, 统一配置管理 1. 在Nacos中添加配置文件 2. 从微服务拉取配置 (1) 引入nacos-config依赖 (2) 添加bootstrap.yaml (3) 读取n…

相机存储卡被格式化了怎么恢复?数据恢复办法分享!

随着时代的发展,相机被越来越多的用户所使用,这也意味着更多的用户面临着相机数据丢失的问题,很多用户在使用相机的过程中,都出现过不小心格式化相机存储卡的情况,里面的数据也将一并消失,相机存储卡被格式…

Android13充电动画实现

充电动画 以MTK平台为例,实现充电动画 效果图 修改文件清单 system/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/charging/BubbleBean.javasystem/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/system…

2023年【道路运输企业安全生产管理人员】考试资料及道路运输企业安全生产管理人员考试技巧

题库来源:安全生产模拟考试一点通公众号小程序 道路运输企业安全生产管理人员考试资料根据新道路运输企业安全生产管理人员考试大纲要求,安全生产模拟考试一点通将道路运输企业安全生产管理人员模拟考试试题进行汇编,组成一套道路运输企业安…

浅谈新能源汽车充电桩的选型与安装

叶根胜 安科瑞电气股份有限公司 上海嘉定201801 摘要:电动汽车的大力发展和推广是国家为应对日益突出的燃油供需矛盾和环境污染,加强生态环境保护和治理而开发新能源和清洁能源的措施之一,加快了电动汽车的发展。如今,电动汽车已…

Pure-Pursuit 跟踪双移线 Gazebo 仿真

Pure-Pursuit 跟踪双移线 Gazebo 仿真 主要参考学习下面的博客和开源项目 自动驾驶规划控制(A*、pure pursuit、LQR算法,使用c在ubuntu和ros环境下实现) https://github.com/NeXTzhao/planning Pure-Pursuit 的理论基础见今年六月…

如何在 Endless OS 上安装 ONLYOFFICE 桌面编辑器 7.5

ONLYOFFICE 桌面编辑器是一款基于依据 AGPL v.3 许可进行分发的开源办公套件。使用这款应用,您无需保持网络连接状态即可处理存储在计算机上的文档。本指南会向您介绍,如何在 Endless OS 上安装 ONLYOFFICE 桌面编辑器 7.5。 ONLYOFFICE 桌面版是什么 O…

Ansible中的任务执行控制

循环 简单循环 {{item}} 迭代变量名称 loop: - value1 - value2 - ... //赋值列表{{item}} //迭代变量名称循环散列或字典列表 - name: create filehosts: host1tasks:- name: file moudleservice:name: "{{ item.name }}"state: "{{…

实验记录之——git push

平时做开发的时候经常push代码不成功,如下图 经好友传授经验,有如下方法 Win cmd使用Clash(端口是7890)代理操作,在cmd中输入: set http_proxy127.0.0.1:7890 set https_proxy127.0.0.1:7890Linux export …

防火墙日志记录和分析

防火墙监控进出网络的流量,并保护部署防火墙的网络免受恶意流量的侵害。它是一个网络安全系统,它根据一些预定义的规则监控传入和传出的流量,它以日志的形式记录有关如何管理流量的信息,日志数据包含流量的源和目标 IP 地址、端口…

可视化流程编排(Bpmn.js)介绍及实践

作者:罗强 为将内部系统打通并规范流程定义,基于统一的平台实现工单自动化流转,从而使用无界山工单系统帮助公司内部人员统一管理和处理来自企业内部提交的工单需求。而在系统中流程编排及节点设计主要是使用bpmn.js实现精细化配置。从而满足各种复杂的业务需求。目…