在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的逻辑。
