SpringSecurityOauth2中关于Oauth2的过滤器设计和SpringSecurity过滤器的设计以及他们的执行顺序

本文详细介绍了SpringSecurityOauth2中Oauth2过滤器与SpringSecurity过滤器的设计和执行顺序。资源服务器的过滤器通过继承ResourceServerConfigurerAdapter并启用@EnableResourceServer来创建过滤器链。SpringSecurity的过滤器则分为configure(WebSecurity web)和configure(HttpSecurity http)两个部分,前者用于设置非业务请求的过滤,后者用于业务过滤器链。执行顺序为:configure(WebSecurity web) -> Oauth2过滤器链 -> SpringSecurity过滤器链。配置不当可能导致无法获取SpringSecurity上下文中的用户信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

简单记录一下吧,他们的执行顺序网上有很多很多的解释,但是哈, 我一直没找到正确的理解,也不知道是不是我搜索方式问题还是我自己理解错了,这表达一下我自己Debug源码的理解

Oauth2的过滤器(资源服务器)

Oauth2的过滤器 其实就是 继承 ResourceServerConfigurerAdapter 这个类后重写其中的 configure(HttpSecurity http)方法 ,代码如下:

@Override
public void configure(HttpSecurity http) throws Exception {
    http
            .authorizeRequests()//得到SpringSecurity接管的请求
            .antMatchers("/api/user/login").permitAll() // 表示 所有请求中 只要匹配了 /system/api/user/login 这个请求 则 放行
            .anyRequest().authenticated()
            .and()
            .csrf().disable();
}

其实只要 ResourceServerConfigurerAdapter 并 加上 @EnableResourceServer 这个注解, 然后重写 configure(HttpSecurity http) 这个方法 就会出现 一个过滤器链 匹配规则是 /** 的 ,

SpringSecurity 过滤器

SpringSecurity 过滤器 , 有两个地方可以设置,代码如下

@Override
public void configure(WebSecurity web) throws Exception {
    // 方便spring boot admin监控
    web.ignoring().antMatchers("/api/test/token");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    // oauth的登录页面嵌入到其他frame页面,它们必须是同一个域
    // 关闭csrf
    http.csrf().disable();
    // ResourceServerConfig和WebSecurityConfig都必须配置关于登录页面的配置
    http
            .antMatcher("ssss")
            .authorizeRequests()
            .antMatchers("/sss", "/aaa").permitAll()
            .anyRequest().authenticated();
}

configure(WebSecurity web) 这个地方 我的理解他是一个过滤器连, 但是他没有过滤器, 所以说我不太确定他是不是一个过滤器连, 他这里这样设计时以为有些请求哈 ,比如说 swagger的一些请求,这些请求并不需要去走一些过滤器,因为他不是业务请求,过滤器的设计一般都是业务,这是我的理解,不知道对不对, 当他匹配不到过滤器的时候 就意味着 直接请求资源了,无需进行一些业务上的操作,这个地方实际项目中要设置很多一些跟项目业务无关的Url,都是在这个地方设计的, 而且 这个过滤器链 是放在集合中首个位置,匹配上了直接放行 , 其次 是 Oauht2中的过滤器链,再者 就是SpringSecurity 过滤器链,也就是configure(HttpSecurity http)这个方法设计的过滤器链啦, 具体debug的截图我就不放了 因为已经下班咯 不搞了 有时间再补图

总结一下:
先执行 configure(WebSecurity web) 这个方法对应的过滤器链
然后执行 Oauth2的过滤器链
最后执行 SpringSecurity 过滤器链 configure(HttpSecurity http)

补充一下 举个例子哈 如果把一些需要访问控制的业务资源接口放到第一个过滤器链中 , 那么 你在SpringSecurity上下文中 是获取不到当前用户信息的, 那是因为他匹配不到过滤器 就直接放行了 不走 将认证结果放入SpringSecurity的上下文中,但是放在第二个第三个过滤器链中 是可以访问到的,现在理解了吧,嘿嘿~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值