SpringSecurity 自定义UsernamePasswordAuthenticationFilter

本文介绍了如何自定义UsernamePasswordAuthenticationFilter以实现密码RSA解密,并将其添加到SpringSecurity的过滤器链中。自定义过滤器适用于非默认登录路径以及需要额外处理如JSON登录、验证码等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UsernamePasswordAuthenticationFilter介绍

UsernamePasswordAuthenticationFilter是AbstractAuthenticationProcessingFilter针对使用用户名和密码进行身份验证而定制化的一个过滤器。其添加是在调用http.formLogin()时作用,默认的登录请求pattern为"/login",并且为POST请求。当我们登录的时候,也就是匹配到loginProcessingUrl,这个过滤器就会委托认证管理器authenticationManager来验证登录。

自定义UsernamePasswordAuthenticationFilter

这里我的需求是通过自定义UsernamePasswordAuthenticationFilter实现对前端传过来的密码进行RSA私钥解密,并且因为登录地址不是"/login",所以继承的是AbstractAuthenticationProcessingFilter,如果登录地址为默认,那么可直接继承UsernamePasswordAuthenticationFilter重写attemptAuthentication方法即可。

public class MyUsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
	public static final String SPRING_SECURITY_FORM_USERNAME_KEY = "username";
	public static final String SPRING_SECUR
### Spring SecurityUsernamePasswordAuthenticationFilter 的使用与配置 #### 配置基础设置 为了使 `UsernamePasswordAuthenticationFilter` 正常工作,在应用程序的安全配置类中需继承 `WebSecurityConfigurerAdapter` 并重写相应方法。通常情况下,当调用 `http.formLogin()` 方法时会自动注册此过滤器[^3]。 ```java @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/home").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll(); } } ``` 上述代码片段展示了如何启用表单登录功能并允许匿名访问 `/login` 页面。这将触发默认的 `UsernamePasswordAuthenticationFilter` 进行处理。 #### 定制化 UsernamePasswordAuthenticationFilter 对于更复杂的需求,可以创建自己的 `UsernamePasswordAuthenticationFilter` 实现: 1. 创建一个新的 Java 类扩展 `UsernamePasswordAuthenticationFilter`. 2. 覆盖必要的方法如 `attemptAuthentication`. ```java public class CustomUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter { private final AuthenticationManager authenticationManager; public CustomUsernamePasswordAuthenticationFilter(AuthenticationManager authenticationManager){ this.authenticationManager = authenticationManager; } @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { // 自定义逻辑... return super.attemptAuthentication(request,response); } } ``` 之后需要在安全配置文件里替换默认的过滤器实例为自定义版本: ```java @Override protected void configure(HttpSecurity http) throws Exception { CustomUsernamePasswordAuthenticationFilter customFilter = new CustomUsernamePasswordAuthenticationFilter(authenticationManagerBean()); http.addFilterAt(customFilter, UsernamePasswordAuthenticationFilter.class) ... } ``` 这样就完成了对 `UsernamePasswordAuthenticationFilter` 的个性化调整. #### 处理 POST 请求 URL 登录认证 默认情况下,`UsernamePasswordAuthenticationFilter` 将监听路径模式为 `/login` 的 POST 请求作为提交用户凭证的方式。可以通过修改 `setFilterProcessesUrl(String defaultFilterProcessesUrl)` 来改变这一行为[^4]: ```java customFilter.setFilterProcessesUrl("/myCustomLoginPath"); ``` 以上操作使得应用能够响应来自不同URL地址上的登录尝试。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值