前言
项目使用的是security安全框架,今天打开项目发现有个接口报npe很奇怪。于是看了下是SecurityContextHolder获取用户信息时候获取不到用户信息了。这个情况以前没有出现过,所以问了下我们项目组长,他说有没有可能是放行接口的原因。为此我专门研究了一下~
分析原因
我们的放行方式是:
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/css/**","/js/**","/index.html","/img/**","/fonts/**","/favicon.ico","/verifyCode");
}
其实我也一直没搞清楚,这种放行方式和permitAll放行有什么区别?
正常这样配置是没有问题的。
如果你很不巧,把登录请求地址放进来了,那就 gg 了。虽然登录请求可以被所有人访问,但是不能放在这里(而应该通过允许匿名访问的方式来给请求放行)。如果放在这里,登录请求将不走 SecurityContextPersistenceFilter 过滤器,也就意味着不会将登录用户信息存入 session,进而导致后续请求无法获取到登录用户信息。
解决方法
就是在上面以匿名访问的形式放行就解决了!代码我就不贴了,因为我手里没有代码,就是用annou。。。什么的去放行
@Configuration
public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin() // 表单方式
.and()
/**就在这写**/
.authorizeRequests() // 授权配置
.anyRequest() // 所有请求
.authenticated(); // 都需要认证
}
}
参考
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/16324.html