Spring Security如何实现支持固定密码+有效期临时密码的登录功能
Spring Boot 2.5 + Spring Security 双密码登录实现组件说明
核心需要扩展/重写的组件
1. 自定义 AuthenticationProvider
这是实现双密码校验的核心组件,无需修改现有UsernamePasswordAuthenticationFilter的逻辑,所有校验规则都可以放在这里实现:
- 推荐直接继承Spring Security默认的
DaoAuthenticationProvider,重写其additionalAuthenticationChecks方法 - 校验逻辑顺序:先用前端传入的密码匹配用户主密码,主密码匹配失败后再校验临时密码有效性:需同时满足「用户存在未过期的临时密码」、「前端传入密码和加密存储的临时密码匹配」两个条件
- 临时密码校验通过后可根据业务需要直接清空用户的临时密码及过期时间字段,避免重复使用
2. 自定义 UserDetails 实现类
默认的User实现类仅包含主密码属性,需要扩展以承载临时密码相关的校验参数:
- 实现
UserDetails接口,新增tempPassword(加密存储的临时密码)、tempPasswordExpireAt(临时密码到期时间戳)两个自定义属性 - 调整你的
UserDetailsService实现类,在loadUserByUsername查询用户信息时,同步把临时密码和过期时间封装到自定义的UserDetails实例中返回
3. 安全配置类注册自定义组件
需要把自定义的认证提供者注册到Spring Security的认证管理器中,替换默认的单密码校验逻辑:
- 在继承
WebSecurityConfigurerAdapter的安全配置类中,重写configure(AuthenticationManagerBuilder auth)方法,调用auth.authenticationProvider(customAuthenticationProvider)注册你实现的自定义AuthenticationProvider - 如果你没有修改用户名、密码的传参规则(即前端还是传递
username、password两个参数进行登录),原有基于UsernamePasswordAuthenticationFilter实现的登录逻辑完全可以复用,不需要做任何调整
可选扩展组件
如果需要补充临时密码相关的业务逻辑,可以扩展以下组件:
- 自定义
AuthenticationSuccessHandler:在用户使用临时密码登录成功后,拦截请求跳转至主密码重置页面,同时清空用户的临时密码 - 定时任务:定期清理数据库中已过期的临时密码字段,避免脏数据占用存储
内容的提问来源于stack exchange,提问作者Aspir
相关产品推荐
相关产品推荐

