自定义Filter应该是最常用的需求了,例如,为了拦截大多数的暴力登录,我们一般会在登录的时候给一个验证码,但是UsernamePasswordAuthenticationFilter没有提供验证码的校验,所以我们就可以自定义一个Filter来处理验证码。
又如,对于前后端分离项目,我们更多使用Token,而不是Session,也可以通过Filter来处理Token的校验,续期的问题。
自定义Filter的方式有很多:
-
直接实现Filter
-
继承GenericFilterBean
-
继承OncePerRequestFilter重写doFilterInternal
-
继承BasicAuthenticationFilter重写doFilterInternal
-
继承AbstractAuthenticationProcessingFilter重写attemptAuthentication
-
继承UsernamePasswordAuthenticationFilter重写attemptAuthentication
-
……
后3个都是认证相关的Filter。
因为涉及到转发重定义等问题,一次请求Filter可能不止一次被调用,OncePerRequestFilter就是为了解决这个问题,它保证一次请求继承它的Filter只会被调用一次。
BasicAuthenticationFilter本身继承了OncePerRequestFilter,所以不用自己处理因为转发等引起的Filter多次调用问题。
AbstractAuthenticationProcessingFilter添加了认证失败,认证成功等处理,但是它没有处理一次请求可能多次调用的问题。
对于表单认证,想偷懒,可以自己继承UsernamePasswordAuthenticationFilter,例如,继承UsernamePasswordAuthenticationFilter,先处理验证码问题,如果校验成功,再调用UsernamePasswordAuthenticationFilter的attemptAuthentication方法。
反正自定义Filter非常灵活,根据自己的喜好选择。
自定义了Filter如何配置呢?
最简单的方式,自定义配置类重写WebSecurityConfigurerAdapter的configure方法: