问题描述
在webSecurity中忽略路径,但是仍然会被Spring Security过滤器拦截到。
解决方案是不要将自定义过滤器交给Spring管理,也就是移除自定义过滤器的@Component
的注解,并且将自定义过滤器以new
的方式手动传入过滤器链中,这时候ignoring配置的路径就生效了。
解决方案
// JwtAuthenticationFilter.java
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull FilterChain filterChain) throws ServletException, IOException {
// ...自定过滤器逻辑
}
}
// SecurityConfig.java
@Configuration
@RequiredArgsConstructor
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig {
private final CustomAuthenticationEntryPoint customAuthenticationEntryPoint;
private final CustomAccessDeniedHandler customAccessDeniedHandler;
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
.authorizeRequests(authorize -> authorize
.antMatchers("/login/**").permitAll()
.anyRequest().authenticated()
)
// 配置自定义过滤器为手动创建的方式传入
.addFilterBefore(new JwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
.build();
}
@Bean
public WebSecurityCustomizer webSecurity(){
return web -> web.ignoring().antMatchers("/login/**");
}
}