自定义Security认证流程

By ref-nobody 创建时间 2025年7月30日 | 本文最后更新于 2025年8月16日 #spring security

在spring-security中,针对于用户名和密码的登录认证已经提供了UsernamePasswordAuthenticationFilter过滤器,而如果我们想使用手机号验证码的认证方式则需要自定义认证过滤逻辑。

自定义认证过滤器可以通过继承OncePerRequestFilter或者AbstractAuthenticationProcessingFilter来实现,这两种方式是有区别的。

OncePerRequestFilter与AbstractAuthenticationProcessingFilter

自定义过滤器filter,可以继承自OncePerRequestFilter或者是AbstractAuthenticationProcessingFilter来实现自己的过滤器。这两个类是有区别的,首先看这两个类的全路径:
1. org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter
2. org.springframework.web.filter.OncePerRequestFilter

可以看到OncePerRequestFilter是在Spring-web包下面,而AbstractAuthenticationProcessingFilter是在spring-security-web包下面。

核心差异

  • 所属体系与用途
    • AbstractAuthenticationProcessingFilter:它是 Spring Security 认证体系的核心组件,专门用于处理认证相关的请求。像表单登录认证就会用到它,其主要职责是对用户身份进行验证。
    • OncePerRequestFilter:这是 Servlet 规范里的一个过滤器基类,在 Spring 框架中得到了扩展。它的作用是确保每个请求只被过滤一次,主要用于实现一些通用的功能,比如日志记录、跨域资源共享(CORS)处理等。
  • 所处位置与调用时机
    • AbstractAuthenticationProcessingFilter:该过滤器运行在 Spring Security 的过滤链之中,只有当请求与特定的认证路径匹配时,它才会被触发执行,这是通过AbstractAuthenticationProcessingFilter的构造方法进行配置的。
    • OncePerRequestFilter:它处于 Spring Security 过滤链的外围,所有的请求都会经过它的处理,而且能对请求和响应进行修改。
  • 异常处理机制
    • AbstractAuthenticationProcessingFilter:内置了一套完整的认证失败处理流程,当认证失败时,会按照既定的流程进行处理。
    • OncePerRequestFilter:需要开发者自己在过滤器中编写异常处理逻辑,它本身并没有提供特定的异常处理机制。

我们在使用security的时候,会通过permitAll()配置一些不需要进行认证的请求,例如登录的请求不需要进行权限认证,会使用HttpSecurity来进行配置:

http
    .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
    .authorizeRequests()
        .antMatchers("/public/**").permitAll()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .anyRequest().authenticated();

需要注意的是这些配置不会影响继承于OncePerRequestFilter类的过滤器,因为OncePerRequestFilter过滤器不是spring security体系下的。
如果需要跳过某个请求uri,则需要自己进行实现;我们也可以重写OncePerRequestFilter中的shouldNotFilter方法即可,这是OncePerRequestFilter类中已经预置好的方法,可以让某些请求不执行当前filter的逻辑。

Leave a Reply

Your email address will not be published. Required fields are marked *

目录