问题
在使用SpringSecurity的时候发现放行指定接口一直没有生效,使用"/**"就可以生效的问题
关于securityConfig的配置代码
@Beanprotected 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路径;