spring-secrity的Filter顺序+自定义过滤器

news2024/10/7 15:21:50

Filter顺序

Spring Security的官方文档向我们提供了filter的顺序,实际应用中无论用到了哪些,整体的顺序是保持不变的:

  1. ChannelProcessingFilter,重定向到其他协议的过滤器。也就是说如果你访问的channel错了,那首先就会在channel之间进行跳转,如http变为https。
  2. SecurityContextPersistenceFilter,请求来临时在SecurityContextHolder中建立一个SecurityContext,然后在请求结束的时候,清空SecurityContextHolder。并且任何对SecurityContext的改变都可以被copy到HttpSession。
  3. ConcurrentSessionFilter,因为它需要使用SecurityContextHolder的功能,而且更新对应session的最后更新时间,以及通过SessionRegistry获取当前的SessionInformation以检查当前的session是否已经过期,过期则会调用LogoutHandler。
  4. 认证处理机制,如UsernamePasswordAuthenticationFilter,CasAuthenticationFilter,BasicAuthenticationFilter等,以至于SecurityContextHolder可以被更新为包含一个有效的Authentication请求。
  5. SecurityContextHolderAwareRequestFilter,它将会把HttpServletRequest封装成一个继承自HttpServletRequestWrapper的SecurityContextHolderAwareRequestWrapper,同时使用SecurityContext实现了HttpServletRequest中与安全相关的方法。
  6. JaasApiIntegrationFilter,如果SecurityContextHolder中拥有的Authentication是一个JaasAuthenticationToken,那么该Filter将使用包含在JaasAuthenticationToken中的Subject继续执行FilterChain。
  7. RememberMeAuthenticationFilter,如果之前的认证处理机制没有更新SecurityContextHolder,并且用户请求包含了一个Remember-Me对应的cookie,那么一个对应的Authentication将会设给SecurityContextHolder。
  8. AnonymousAuthenticationFilter,如果之前的认证机制都没有更新SecurityContextHolder拥有的Authentication,那么一个AnonymousAuthenticationToken将会设给SecurityContextHolder
  9. ExceptionTransactionFilter,用于处理在FilterChain范围内抛出的AccessDeniedException和AuthenticationException,并把它们转换为对应的Http错误码返回或者对应的页面。
  10. FilterSecurityInterceptor,保护Web URI,进行权限认证,并且在访问被拒绝时抛出异常。

自定义过滤器

       除了这些过滤器外,我们可能还需要在认证链路中自定义一些过滤器。

       oauth2拦截器在初始化完成后,共会生成三个拦截器调用链,分别对应oauth/token等的oauth2认证拦截器调用链,对resource资源访问的拦截器调用链,springsecurity的拦截器调用链。

  1. oauth2认证拦截器调用链

       通过AuthorizationServerSecurityConfigurer的addTokenEndpointAuthenticationFilter()方法我们可以在BasicAuticaitonFilter前加入拦截器。

       这个过滤器是在ClientCredentialsTokenEndpointFilter之后的,所以,如果想在ClientCredentialsTokenEndpointFilter过滤器之前加过滤器的话, 我还没找到方法

@Configuration
public class OAuth2ServerFilterConfig extends AuthorizationServerConfigurerAdapter {

    @Override
    public void configure(AuthorizationServerSecurityConfigurer configurer) throws Exception {
        configurer.addTokenEndpointAuthenticationFilter(oauth2JsonClientAuthFilter());
    }

    private Filter oauth2JsonClientAuthFilter() {
        Oauth2JsonClientAuthFilter oauth2JsonClientAuthFilter = new Oauth2JsonClientAuthFilter();
        oauth2JsonClientAuthFilter.setAuthenticationSuccessHandler(new AuthenticationSuccessHandler() {
            @Override
            public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
                Authentication authentication) throws IOException, ServletException {

            }
        });
        return oauth2JsonClientAuthFilter;

    }
}  

2. resource资源拦截器调用链

@Configuration
public class AuthResourceServerConfigurer extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        super.configure(resources);
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated();
        //这个是对所有url都进行拦截,因为没设置发现只有对部分url生效
        http.requestMatcher(AnyRequestMatcher.INSTANCE);
    }
}

3.springsecurity认证拦截器

public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
    //其余代码省略
    http.addFilterBefore(mutiLoginDemoFilter(httpSecurity), BasicAuticaitonFilter.class);
    }
}

这里springsecurity的加入的过滤器都比addTokenEndpointAuthenticationFilter加入的过滤器执行晚,通过代码就可以看出:

public final class HttpSecurity extends
		AbstractConfiguredSecurityBuilder<DefaultSecurityFilterChain, HttpSecurity>
		implements SecurityBuilder<DefaultSecurityFilterChain>,
		HttpSecurityBuilder<HttpSecurity> {

@Override
	protected DefaultSecurityFilterChain performBuild() {
        //这里获取所有的拦截器,filters.sort(comparator) 将所有的过滤器排序后返回
		filters.sort(comparator);
		return new DefaultSecurityFilterChain(requestMatcher, filters);
	}

}

public HttpSecurity addFilterBefore(Filter filter,
			Class<? extends Filter> beforeFilter) {
		comparator.registerBefore(filter.getClass(), beforeFilter);
		return addFilter(filter);
	}

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

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

相关文章

【LeetCode-中等题】79. 单词搜索

文章目录 题目方法一&#xff1a;递归 回溯 题目 方法一&#xff1a;递归 回溯 需要一个标记数组 来标志格子字符是否被使用过了先找到word 的第一个字符在表格中的位置&#xff0c;再开始递归递归的结束条件是如果word递归到了最后一个字符了&#xff0c;说明能在矩阵中找到单…

学历低不能学编程?

最近&#xff0c;有小伙伴向小编提问&#xff1a;自己学历低是否可以学编程呢&#xff1f;围绕这个问题&#xff0c;相信也有不少小伙伴也有这个疑问&#xff0c;那就让我们一起来揭晓这个谜底吧&#xff01; 答案是&#xff1a;当然可以&#xff01;为什么呢&#xff1f; 首…

在线积分求解网站和求解举例

在线积分求解网站和求解举例 在进行复杂计算时&#xff0c;有时会遇到积分求解的问题&#xff0c;基于大学高数、积分变换、复变函数或者矩阵论等理论知识可以通过解析方式求解所遇到的积分问题。在这个求解过程中&#xff0c;能够清晰的理解积分求解基本知识和技巧。有时&…

macbook命令行乱码处理办法

作者&#xff1a;吴业亮 博客&#xff1a;wuyeliang.blog.csdn.net 1、设置编码 2、在终端下输入在这里插入代码片 vi ~/.zshrc在文件内容末端添加&#xff1a; export LC_ALLen_US.UTF-8 export LANGen_US.UTF-8最后再让设置生效 source ~/.zshrc

web请求cookie中expires总结

用意 cookie 有失效日期 "expires"&#xff0c;如果还没有过失效期&#xff0c;即使重新启动电脑&#xff0c;cookie 仍然不会丢失 注意&#xff1a;如果没有指定 expires 值&#xff0c;那么在关闭浏览器时&#xff0c;cookie 即失效。 设置 如果cookie存储时间大…

【GO语言基础】变量常量

系列文章目录 【Go语言学习】ide安装与配置 【GO语言基础】前言 【GO语言基础】变量常量 【GO语言基础】数据类型 【GO语言基础】运算符 文章目录 系列文章目录常量和枚举变量声明全局变量声明大小写敏感 总结 常量和枚举 使用const关键字声明常量&#xff0c;并为每个常量提…

游戏平台加盟该怎么做?需要准备什么?

游戏平台加盟是一种合作模式&#xff0c;允许个人或企业以加盟商的身份参与游戏平台&#xff0c;并从中获得一定的权益和收益。以下是一些步骤和需要准备的事项&#xff0c;来考虑如何进行游戏平台加盟&#xff1a; 步骤&#xff1a; 研究市场和平台&#xff1a;了解游戏市场和…

【Python+selenium】自动化生成测试报告

批量执行完用例后&#xff0c;生成的测试报告是文本形式的&#xff0c;不够直观&#xff0c;为了更好的展示测试报告&#xff0c;最好是生成HTML格式的。 unittest里面是不能生成html格式报告的&#xff0c;需要导入一个第三方的模块&#xff1a;HTMLTestRunner 一、入HTMLTe…

BMS电池管理系统——BMS的功能模块及基本要素(二)

BMS电池管理系统 文章目录 BMS电池管理系统前言一、BMS电池管理系统各个功能模块的关系二、BMS的边界及基本要素 前言 前面了解了BMS以及他的功能模块&#xff0c;这些功能模块之间的关系是什么呢&#xff1f; 一、BMS电池管理系统各个功能模块的关系 下面我们分析一下这张图…

Yolov8-pose关键点检测:模型轻量化创新 | ScConv结合c2f | CVPR2023

💡💡💡本文解决什么问题:ScConv(空间和通道重建卷积),一个即插即用的架构单元,可以可以直接用来替代各种卷积神经网络中的标准卷积。 ScConv | GFLOPs从9.6降低至9,参数量从6482kb降低至6479kb Yolov8-Pose关键点检测专栏介绍:https://blog.csdn.net/m0_637742…

BLE Mesh蓝牙mesh网多跳大数据量高带宽传输数据方法

1、BLE Mesh数据传输现状 BLE Mesh网络技术是低功耗蓝牙的一个进阶版&#xff0c;Mesh扩大了蓝牙在应用中的规模和范围&#xff0c;因为它同时支持超过三万个网络节点&#xff0c;可以跨越大型建筑物&#xff0c;不仅可以使得医疗健康应用更加方便快捷&#xff0c;还能监测像学…

Javase | 数组、数组工具类

目录&#xff1a; 1.数组2.数组的 “存储结构”3.数组的优缺点&#xff1a;3.1 数组的优点3.2 为什么数组的检索效率高&#xff1f;3.3 数组的缺点 4.一维数组4.1 一维数组的“存储结构”4.2 一维数组的“静态初始化”4.3 一维数组的“动态初始化”4.4 一维数组的“遍历” 5.数…

闪存芯片的冷知识

闪存芯片不带电存储数据的原理 闪存芯片是一种非易失性的存储器&#xff0c;即它可以在断电后保持数据不丢失。闪存芯片的核心部分是浮栅晶体管&#xff08;Floating Gate Transistor&#xff09;&#xff0c;它是一种特殊的MOSFET&#xff08;金属氧化物半导体场效应晶体管&a…

方案:TSINGSEE青犀AI智能分析网关森林防火智慧监管平台方案

一、方案背景 森林是地球上最重要的生态系统之一&#xff0c;对环境、气候、水循环和空气质量具有重要影响。森林火灾会造成巨大的经济损失&#xff0c;具有发生面广、突发性强、破坏性大、危险性高、处置扑救特别困难等特点&#xff0c;严重危及人民生命财产和森林资源安全&a…

功能测试就只是说的点点点嘛,这么容易?

那你要知道往往说的容易&#xff0c;做起来难呀。 功能测试虽然说的是点点点&#xff0c;但是对于比较简单的一个小功能来说&#xff0c;确实没有什么太难得地方&#xff0c;点的流畅没有问题&#xff0c;那就再好不过&#xff0c;基本上有问题也是暴露的非常明显&#xff0c;…

用于充电桩直流计量电能表DJSF1352-RN/D带UL证书-安科瑞黄安南

1什么是UL认证&#xff1f; UL认证是由美国安全实验室&#xff08;Underwriters Laboratories&#xff09;提供的安全性认证服务。UL认证虽然不是强制的&#xff0c;但它是北美市场的保证&#xff0c;有UL标志的产品具有很高的市场认可度。 2安科瑞导轨式直流电能表 安科瑞导…

日志输出-查看 SQL:深入分析 MyBatis 执行过程

&#x1f600;前言 在现代软件开发中&#xff0c;数据库操作是不可或缺的一部分&#xff0c;而持久层框架的应用能够极大地简化这一过程。然而&#xff0c;当我们在开发 MyBatis 程序时&#xff0c;有时候需要深入了解程序底层实际执行的 SQL 语句&#xff0c;以便更好地分析和…

C++毕业设计基于QT实现的超市收银管理系统源代码+数据库

C毕业设计基于QT实现的超市收银管理系统源代码数据库 编译使用 编译完成后&#xff0c;需要拷贝 file目录下的数据库 POP.db文件到可执行程序目录下 登录界面 主界面 会员管理 完整代码下载地址&#xff1a;基于QT实现的超市收银管理系统源代码数据库

Linux基础知识及常见指令

Linux简介及相关概念 什么是Linux&#xff1f; Linux是一个免费开源的操作系统内核&#xff0c;最初由Linus Torvalds于1991年创建。它是各种Linux发行版&#xff08;通常称为“发行版”&#xff09;的核心组件&#xff0c;这些发行版是完整的操作系统&#xff0c;包括Linux内…

centos7手动配置jdk1.8环境与maven环境

安装jdk1.8 链接&#xff1a;https://pan.baidu.com/s/1_P7jHzH4Lk2jcPWWD7pi4w 提取码&#xff1a;6kkm winscp软件上传压缩包到Linux中 解压 # 解压到/usr/local/java目录下 tar -zxvf jdk-8u381-linux-x64.tar.gz -C /usr/local/java配置环境变量 vi /etc/profile # 最后…