前言
简单记录一下吧,他们的执行顺序网上有很多很多的解释,但是哈, 我一直没找到正确的理解,也不知道是不是我搜索方式问题还是我自己理解错了,这表达一下我自己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的上下文中,但是放在第二个第三个过滤器链中 是可以访问到的,现在理解了吧,嘿嘿~~