问题
在使用SpringSecurity的时候发现放行指定接口一直没有生效,使用"/**"就可以生效的问题
关于securityConfig的配置代码
@Bean
protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf().disable() // 关闭csrf防护,不过使用session保存在cookie中的话还是得开启csrf防护的
.formLogin().disable() // 禁用默认登录页
.logout().disable() // 禁用默认登出页
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)) // STATELESS禁用session(使用token作为会话的情况)
.exceptionHandling(exceptions -> exceptions.accessDeniedHandler(accessDeniedHandler)) // 自定义授权异常处理
.exceptionHandling(exceptions -> exceptions.authenticationEntryPoint(authenticationEntryPoint)) // 自定义认证异常处理
.authorizeRequests()
.antMatchers("/auth/login").permitAll() // 放行接口
.antMatchers("/api/admin/**", "/api/setting/**").hasAuthority("admin") // 指定“admin”权限放行
.anyRequest().authenticated(); // 所有接口都需要验证
// 将自定义的过滤器指定执行顺序,在UsernamePasswordAuthenticationFilter之前
http.addFilterBefore(sessionAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
// 允许跨域
http.cors();
return http.build();
}
而YML文件配置中也配置了context-path路径
解决问题及原因
通过输出security的dubug信息可以发现,添加到matchers中的是“/sinderBoot/auth/login”,但是当我们请求后发现,实际上security识别的是"/auth/login"。
通过查看FilterChainProxy的源码可以看到,当servletPath为空的时候会截取contextPath再校验。
总结
当你在yml文件中配置了ContextPath的时候,security中的放行接口就不用加上contextPath路径;