Spring Security 实现 antMatchers 配置路径的动态获取

2023-11-11

1. 为什么要实现动态的获取 antMatchers 配置的数据  

        这两天由于公司项目的需求,对 spring security 的应用过程中需要实现动态的获取 antMatchers ,permitAll , hasAnyRole , hasIpAddress 等这些原本通过硬编码的方式配置的数据。为了让每一个业务服务不用再去处理权限验证等这些和业务无关的逻辑,而是只专注于它所负责的业务,就要将认证、授权统一的放在 API 网关层去处理。但是每个不同的业务服务有的接口需要认证后才能访问,有的接口是不需要认证就可以访问的,有的接口可能是需要某些权限、角色才可以访问。这样依赖 API 网关就必须知道并且能够区分出来每个业务服务的接口哪些是需要认证后才可以访问的,那些接口是不需要经过认证就可以访问的。 为了实现这个功能 spring security 提供的 antMatchers 函数硬编码的方式就不适用了。而是应该提供一个管理端,每个业务服务把他们这些个性化的接口通过管理端去进行配置,统一的存储起来,spring security 在获取这些数据的时候从统一的存储中来获取这些数据。基于这个需求前提我来考虑如何实现这个功能。配套视频讲解地址 :http://www.iqiyi.com/w_19s456x5b5.html?pltfm=11&pos=title&flashvars=videoIsFromQidan%3Ditemviewclk_a#vfrm=5-6-0-1

2.  从 Spring Security 框架中找到适合实现该功能的切入点

        想要找个框架的切入点必须对框架如何工作,源码要熟悉,不然很难找到一个合适的切入点。有点见缝插针的意思,首先就需要找到一个适合“插针”的位置。

2.1 FilterSecurityInterceptor

        FilterSecurityInterceptor 过滤器是 Spring Security 过滤器链条中的最后一个过滤器,它的任务是来最终决定一个请求是否可以被允许访问。

org.springframework.security.web.access.intercept.FilterSecurityInterceptor#invoke 函数源码:这个函数中做了调用下一个过滤器的操作,也就是这行代码 fi.getChain().doFilter(fi.getRequest(), fi.getResponse()) 。因为 FilterSecurityInterceptor 是Security 过滤器链条中的最后一个过滤器,再去调用下一个过滤器就是调用原始过滤器链条中的下一个过滤器了,这也就意味着请求是被允许访问的。但是在调用下一个过滤器之前还有一行代码 ,InterceptorStatusToken token = super.beforeInvocation(fi); 这一行代码就会决定本次请求是否会被放行。

public void invoke(FilterInvocation fi) throws IOException, ServletException {
		if ((fi.getRequest() != null)
				&& (fi.getRequest().getAttribute(FILTER_APPLIED) != null)
				&& observeOncePerRequest) {
			// filter already applied to this request and user wants us to observe
			// once-per-request handling, so don't re-do security checking
			fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
		}
		else {
			// first time this request being called, so perform security checking
			if (fi.getRequest() != null) {
				fi.getRequest().setAttribute(FILTER_APPLIED, Boolean.TRUE);
			}

			InterceptorStatusToken token = super.beforeInvocation(fi);

			try {
				fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
			}
			finally {
				super.finallyInvocation(token);
			}

			super.afterInvocation(token, null);
		}
	}

 

        org.springframework.security.access.intercept.AbstractSecurityInterceptor#beforeInvocation 函数源码:这个函数做的事情大致是对这次请求是禁止访问还是允许访问进行投票,如果投票都通过的话就允许访问,如果有一票反对就会禁止访问抛出异常结束后续处理流程。投票的依据就是通过这行代码 

Collection<ConfigAttribute> attributes = this.obtainSecurityMetadataSource().getAttributes(object); 获取到的。这行代码也就是我实现功能的切入点。它先获取了一个 SecurityMetadataSource 对象,然后通过这个对象获取了投票的依据。 我的思路就是自定义 SecurityMetadataSource 类的子类,来替换掉 FilterSecurityInterceptor 中的 SecurityMetadataSource 实例。

protected InterceptorStatusToken beforeInvocation(Object object) {
		Assert.notNull(object, "Object was null");
		final boolean debug = logger.isDebugEnabled();

		if (!getSecureObjectClass().isAssignableFrom(object.getClass())) {
			throw new IllegalArgumentException(
					"Security invocation attempted for object "
							+ object.getClass().getName()
							+ " but AbstractSecurityInterceptor only configured to support secure objects of type: "
							+ getSecureObjectClass());
		}

		Collection<ConfigAttribute> attributes = this.obtainSecurityMetadataSource()
				.getAttributes
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Security 实现 antMatchers 配置路径的动态获取 的相关文章

  • 如何编写 Maven 构建脚本来执行 Java

    如何在构建过程中或构建刚刚完成后执行 Java 程序 可以直接从 pom 中执行此操作吗 mvn exec java Dexec mainClass org sonatype mavenbook weather Main EDIT 假设我想
  • 从txt文件中读取数据而不下载它?

    我想从提供的文本文件中解析信息 有没有一种方法可以在应用程序中执行此操作 而无需先下载文件 以某种方式传输文本内容 打开到 URL 的 Http 连接 使用内置 HttpURLConnection 或使用 commons httpclien
  • IBM Websphere MQ - 用于 Tomcat 部署的 EJB 和 MDB 迁移

    我已经为此苦苦挣扎了很长一段时间 我有一个 IBM Websphere MQ 它使用 EJB 和 MDB 以下是配置ejb mdb的地方
  • java 拖放

    我尝试熟悉java中的拖放 但我发现的所有教程都是 让我生气 我想要的只是从 JList 包含在名为 UserPanel 的自制 JPanel 中 拖动 PublicUserLabel 并将其放入从 JTabbedPanel 继承的自制类中
  • 在java代码中创建postgresql表

    我有一个与 postgreSQL 数据库连接的 java 代码 现在 我希望当它连接到数据库时 我还将创建数据库表 但我的问题是 它不会创建数据库 我不知道问题是什么 这是我的代码 Statement st null ResultSet r
  • 如何重复一段文本中的每个字母?爪哇语

    就像在口吃中一样 如果文本为 dean 并且乘数为 3 则结果将是 dddeeeaaannn 由提供的乘数指定的次数 public static void repeatLetters String text dean int n 3 Str
  • Java 错误和警告列表

    在哪里 如何获得所有 java 和 javac 的错误和警告消息的列表 This http mindprod com jgloss compileerrormessages html我认为页面是您所需要的
  • 二元运算符 >=、-、* 的错误操作数类型

    我无法弄清楚如何修复代码中不断出现的这些错误 import java util Scanner public class Unit02Prog1 public static void main String args Scanner inp
  • 无法在 Intellij 中运行主类[重复]

    这个问题在这里已经有答案了 我有以下项目结构 ProjectRoot src Main examples libs My src文件夹被标记为sources在 Intellij 中 现在 当我想运行 Main 类时 出现以下错误 Excep
  • 用于制作代码编辑器的 JavaFX 相当于 JSyntaxPane 的什么?

    以前在 Swing 中 我使用过JSyntaxPane用于制作一个小型 Java 源代码编辑器 为了练习 我决定用 JavaFX 重做整个项目并添加对更多语言的支持 最好是尽可能多 不过好像没有什么类似的JSyntaxPane 一些研究让我
  • 是否可以使用 Apache Tika 提取表信息?

    我正在寻找 pdf 和 MS Office 文档格式的解析器 以从文件中提取表格信息 当我看到 Apache Tika 时 正在考虑编写单独的实现 我能够从任何这些文件格式中提取全文 但我的要求是提取表格数据 我希望有 2 列采用键值格式
  • 如何使用 aether 从 Java 找到最新版本的 Maven 工件?

    他们的文档非常薄弱 我无法弄清楚 我找到了部分答案here https stackoverflow com questions 27428068 how to retrieve the latest also snapshot versio
  • 如何检查单词是否在wordNet中

    我开始了解wordNet直到我知道我找到了synonymous对于一个特定的词 现在我有一个文件 我想使用标记化该文本n gram例如 String s I like to wear tee shirt 使用后n gram这将是 I lik
  • java.exe 以非零退出值 1 结束

    只是为了开始 我并不是真正尝试从 Android 中的 xlsx 文件中读取单元格 我已经尝试了几乎所有我在 Google 上搜索到的内容 但是每次 在两台不同的 PC 上 都是 Java 1 7 0 79 当我尝试构建 运行 这个应用程序
  • 从字符串中删除重音符号

    Android 中有没有什么方法 据我所知 没有 java text Normalizer 可以从字符串中删除任何重音 例如 变成 eau 如果可能的话 我想避免解析字符串来检查每个字符 java text NormalizerAndroi
  • 如何获取 JDBC 中 UPDATE 查询影响的所有行?

    我有一项任务需要使用更新记录PreparedStatement 一旦记录被更新 我们知道更新查询返回计数 即受影响的行数 但是 我想要的不是计数 而是受更新查询影响的行作为响应 或者至少是受影响的行的 id 值列表 这是我的更新查询 UPD
  • 获取接收者的设备令牌以在 Firebase 中发送通知

    所以我正在学习如何使用 firebase 发送设备到设备的通知 我看到了这个answer https stackoverflow com a 42548586 5237289发送通知 看起来很简单 现在 我知道要获取发件人的令牌 它应该如下
  • 如何使用 AffineTransform.quadrantRotate 旋转位图?

    我想旋转一个bitmap关于它的中心点 然后将其绘制成更大的图形上下文 位图是40x40 pixels 图形上下文是500x500 pixels 这就是我正在做的 BufferedImage bi new BufferedImage 500
  • junit4 使用特定测试方法创建测试套件

    在 junit4 中 我想执行来自不同类的特定测试方法 即想要使用来自不同类的特定测试方法创建一个测试套件 假设我有两门课 public class Test Login Test public void test Login 001 Sy
  • Axis2 的 wsdl2java 在 RPC/Encoded 样式 Web 服务上失败

    Axis2 有替代方案吗 或者让它工作的方式 例如不同的数据绑定 Retrieving document at Exception in thread main org apache axis2 wsdl codegen CodeGener

随机推荐

  • 【ffmpeg基础】ffmpeg的下载安装

    一 ffmpeg的下载 1 ffmpeg github下载路径 https github com FFmpeg FFmpeg git 在ffmpeg的github上可以下载任意版本的源码 比如最新的matser上的源码 以及各个分支上 如f
  • unity 屏幕虚拟键盘

    工作上碰到许多程序需要用到键盘输入功能 调用的电脑自带键盘使用也不方便 自己写的一个键盘工具 功能 键盘大小写状态监测 设置了输入法提示词位置的定位 定位根据屏幕分辨率设置 故编辑器模式下位置有偏移 可自行调整 工具连接 https dow
  • rocketMq消息队列原生api使用以及rocketMq整合springboot

    rocketMq消息队列 文章目录 rocketMq消息队列 一 RocketMQ原生API使用 1 测试环境搭建 2 RocketMQ的编程模型 3 RocketMQ的消息样例 3 1 基本样例 3 2 顺序消息 3 3 广播消息 3 4
  • Friend-Graph HDU - 6152 签到题 暴力遍历

    Friend Graph HDU 6152 题意 给你n个人 告诉你他们之间的关系 如果有三个以上的人互相不认识或者互相认识 就认为这个团队是 Bad Team 反之输出 Great Team 我的想法就是暴力搜索 用一个二维数组保存每个人
  • 利用硬件实现矩阵乘法加速

    对于绝大多数程序员来说 优化程序往往是在算法方面 但了解一定的计算机硬件知识后 可以隐式地优化程序 下面以矩阵乘法为例 探讨计算机硬件在程序优化中的作用 原理 学过计算机组成原理的都知道 CPU访问内存的速度比CPU计算速度慢得多 为了解决
  • WKWebView设置请求头HTTPHeaderField

    WKWebView HTTPHeaderField WKWebView的请求头添加字段 系统的NSMutableHTTPURLRequest类提供了获取HTTP请求的请求头 HTTPHeader 和设置 添加HTTP请求的请求头的API p
  • 龙书D3D11章节习题答案(第四章)

    以下答案仅供参考 有错欢迎留言 Chapter 4 Direct3D Initialzation 1 Modify the previous exercise solution by disabling the ALT ENTER func
  • DVWA XSS总结

    笔者对该靶场所需的相关知识进行了总结 拓展 供大家学习参考 XSS 漏洞学习 DVWA XSS Reflected low 未进行过滤 构造payload medium 过滤规则 把 lt script gt 用str replace 函数
  • Java类加载

    1 JAVA类装载器在装载类的时候是按需加载的 只有当一个类要使用 使用new 关键字来实例化一个类 的时候 类加载器才会加载这 个类并初始化 类Main java 代码 publicclass Main publicstaticvoid
  • STM32—CAN通信

    文章目录 一 CAN通信简介 1 1 CAN简介 1 2 CAN协议特点 1 3 CAN通信的帧类型 1 4 数据帧结构 1 5 CAN的位时序 1 6 CAN的仲裁功能 二 STM32F1的CAN 2 1 bxCAN简介 2 2 bxCA
  • 8-js高级-6(promise)

    一 Promise 的理解和使用 1 Promise 是什么 理解 抽象表达 Promise 是一门新的技术 ES6 规范 Promise 是 JS 中进行异步编程的新解决方案 备注 旧方案是单纯使用回调函数 具体表达 从语法上来说 Pro
  • c语言练习题56:变种水仙花

    变种水仙花 描述 变种水仙花数 Lily Number 把任意的数字 从中间拆分成两个数字 比如1461 可以拆分成 1和461 14和61 146和1 如果所有拆分后的乘积之和等于自身 则是一个Lily Number 例如 655 6 5
  • Echarts柱状图的点击事件

    最近在做一些图表统计的功能 用到了百度的开源图表软件Echatrs 不得不提的是 不但上手简单而且扩展功能也是十分强大 在使用的过程中也遇到了不少问题 可能由于有关Echatrs的资料并不是很齐全 所以查找资料的过程也是相当曲折的 所以还是
  • 硬盘错误计数 计算机内存不足,硬盘问题!Ultra DMA CRC错误计数 电脑死机

    最近电脑经常出现卡机状态 此状态出现前先是硬盘嗡嗡响 就像汽车油门一样 一加一松 但声音不是很大 然后硬盘紧接着还有嘎吱的响声 这样重复几次 出现这种声音的时候 电脑出现死机状态 但停上几分钟后 一切恢复正常 有时候也会卡到电脑自动重新启动
  • linux下sqlite3的使用实例(c语言)

    文章目录 1 安装数据库 2 相关函数 3 代码实例 3 1创建一个数据库 3 2插入数据 3 3查看表的内容 3 4删除数据 1 安装数据库 Linux 下安装sqlite3 需要两个个命令 即可 1 sudo apt get insta
  • Bootstrap Table行内添加/行内编辑案例

    项目场景 JQuery版本为 3 6 0 Bootstrap版本为 3 4 1 Bootstrap Table版本为 1 8 1 Bootstrap Table Edit版本为 1 0 Bootstrap Select版本为 1 0 Boo
  • c++排序算法(快速排序、冒泡排序、选择排序)

    1 快速排序 这里的容器是全局的 不全局的话 可以在参数那里加个数组的参数传进来 从大到小 从大到小排序 void ResManage quickSortLastUpdateTime const int iLeftIndex const i
  • 华为手机投屏电脑_华为手机如何实现无线投屏?

    朋友们 大家好 大家知道吗 其实我们风雪社是可以留言的 点击下面图片就可以跳转到留言界面哦 别担心 没有广告的 接下来 开始今天的内容了 大家都知道一些华为手机支持无线投屏 那用华为的朋友们 如何知道自己的手机是否可以投大屏幕呢 如果可以
  • Qt--02:设置父对象

    问题引入 在Widget中创建Button等控件时 如果不指定Button等控件的父对象 就会产生相关控件无法再此Widget窗口中显示 因此当一些控件需要在当前Widget窗口中显示的时候就需要为控件添加父对象 指定父对象方式 setPa
  • Spring Security 实现 antMatchers 配置路径的动态获取

    为什么80 的码农都做不了架构师 gt gt gt 1 为什么要实现动态的获取 antMatchers 配置的数据 这两天由于公司项目的需求 对 spring security 的应用过程中需要实现动态的获取 antMatchers per