请求未携带token,SpringSecurity是如何拦截到请求并返回403的?
首先有一点要明确,SpringSecurity通过一层层filter过滤请求的。在这些filter中有一个关键类org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter
里面有一个doFilter方法,关键代码如下:
参考资料
注册在Eureka访问/actuator 404的问题
之前以为404的问题跟注册中心有关,实际没关心在yml中作出如下配置就可访问到
management:
endpoints:
web:
exposure:
include: ['*']
anyRequest().permitAll() 和 antMatchers(“/*”).permitAll() 区别
之前同事配置的WebSecurityConfigurerAdapter.configure(HttpSecurity http)
对所有request方法都拦截不到,直接放行了。
查下了代码他对请求拦截的处理方式是这样的antMatchers("/*").permitAll()
。
实践发现这样的配置只能拦截到/api
这种的,但是实际项目中的配置请求url都是/api/page/user/list
这种的,导致根本拦截不到。正解应该是用anyRequest().permitAll()
或antMatchers("/**").permitAll()
。
请求已配置免认证但是携带token请求时提示invalid_token Cannot convert access token to JSON
场景:
A服务接口调用B服务的接口但是A、B服务不在一个注册中心,于是通过框架封装的OkHttpClient发起请求,B服务将这个接口url配置为permitAll,但是调用失败
原因:
A服务的接口调用时,携带了A服务的token,这个token也带到了B服务中去,由于A、B服务token不共用导致解析token时异常
源码分析:
org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter
解决方法:
- A服务的接口调用B服务接口时,再通过OkHttpClient调用哪一步,将token清除掉(重新new HttpHeaders()),该方式B服务必须配置请求接口的免认证
- 先获取B服务的token,带着B服务的token去调用B服务接口,该方式B服务不用配置请求接口的免认证
个人理解:
当请求的url已经免认证了为啥要走到OAuth2AuthenticationProcessingFilter这个过滤器中呢?不进到这个过滤器中就可以避免token验证有效性的问题了