Spring Security自定义UsernamePasswordAuthenticationFilter未替换默认过滤器不触发问题
自定义UsernamePasswordAuthenticationFilter未触发的常见遗漏配置
1. 未修改Filter默认的触发路径规则
UsernamePasswordAuthenticationFilter 默认仅拦截 POST /login 路径的请求,如果你需要对所有请求做身份校验,必须修改触发规则:
- 方式一:在自定义Filter构造方法中设置全局匹配路径
public FireBaseAuthenticationFilter() { // 匹配所有请求路径 setFilterProcessesUrl("/**"); }
- 方式二:重写
requiresAuthentication方法自定义触发逻辑
@Override protected boolean requiresAuthentication(HttpServletRequest request, HttpServletResponse response) { // 可自定义请求触发规则,返回true代表当前请求需要走该Filter校验 return true; }
2. Filter注册位置错误
在WebSecurityConfigurerAdapter的configure(HttpSecurity http)方法中添加自定义Filter时,必须指定正确的执行顺序,不能直接使用addFilter方法,需要指定在默认UsernamePasswordAuthenticationFilter的同位置或者前置执行:
@Override protected void configure(HttpSecurity http) throws Exception { http .cors().disable() .csrf().disable() .httpBasic().disable() .formLogin().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() .anyRequest().authenticated() // 关键配置:指定自定义Filter的执行位置 .and() .addFilterAt(new FireBaseAuthenticationFilter(authenticationManager()), UsernamePasswordAuthenticationFilter.class); }
注意:注入自定义Filter时必须传入AuthenticationManager实例,否则Filter初始化会失败直接跳过执行。
3. 自定义Filter未正确纳入Spring Security过滤器链
- 不要给
FireBaseAuthenticationFilter类添加@Component/@Bean注解,否则会被Spring Boot自动注册到原生Servlet过滤器链,不会进入Spring Security的专属过滤器链 - 如果需要注入其他Bean到自定义Filter中,在配置类中手动构造Filter实例并传入依赖,再注册到Spring Security链中即可
4. 安全路径匹配规则冲突
如果你的安全配置中配置了路径放行规则,需要确保需要认证的路径没有被提前排除,例如以下配置会导致所有请求直接放行,不会触发认证Filter:
// 错误示例 http.authorizeRequests().anyRequest().permitAll()
内容的提问来源于stack exchange,提问作者Oirampok
相关产品推荐
相关产品推荐

