CAS 6.2.7密码修改请求添加当前密码字段的实现方案问询
CAS 6.2.7 新增当前密码字段实现字符轮换校验方案
下面是无侵入的可行实现步骤,不需要修改CAS核心模块源码:
1. 自定义密码请求模型
新建自定义类继承官方PasswordChangeRequest,新增当前密码字段,避免直接修改核心模块源码:
public class CustomPasswordChangeRequest extends PasswordChangeRequest { private String currentPassword; // 添加getter、setter方法 public String getCurrentPassword() { return currentPassword; } public void setCurrentPassword(String currentPassword) { this.currentPassword = currentPassword; } }
2. 自定义Webflow绑定配置
实现CAS的Webflow扩展配置,替换密码重置页的模型绑定规则:
- 新增配置类继承
BaseWebflowConfigurer,重写doInitialize方法 - 找到密码修改的视图状态
viewState,将其modelClass属性设置为你自定义的CustomPasswordChangeRequest全类名 - 给密码提交的动作状态添加
currentPassword参数绑定,确保提交时参数能自动映射到自定义模型
3. 修改Thymeleaf密码重置模板
在密码重置表单中新增当前密码输入框,绑定模型字段:
<div class="form-group"> <label for="currentPassword">当前密码</label> <input type="password" id="currentPassword" name="currentPassword" th:field="*{currentPassword}" class="form-control" required> </div>
4. 新增字符轮换校验逻辑
在模板的表单提交事件中添加前端校验,符合你要求的最小字符轮换规则,校验不通过则阻止表单提交:
document.querySelector('#passwordResetForm').addEventListener('submit', function(e) { const oldPwd = document.querySelector('#currentPassword').value; const newPwd = document.querySelector('#password').value; // 自定义你的字符轮换校验逻辑,比如相同字符占比不超过N%,或者连续相同字符不超过M个 let sameCharCount = 0; for (let i = 0; i < Math.min(oldPwd.length, newPwd.length); i++) { if (oldPwd[i] === newPwd[i]) sameCharCount++; } if (sameCharCount > 3) { // 示例规则:连续相同字符不能超过3个,可自行修改 e.preventDefault(); alert('新密码与旧密码重复字符过多,请调整'); return false; } })
5. 后端补充校验(可选,推荐)
扩展官方PasswordValidationService,新增当前密码和新密码的字符轮换校验逻辑,避免前端校验被绕过,校验不通过时返回对应错误信息到前端页面。
注意事项
- 自定义Webflow配置类需要添加
@Configuration注解注册到Spring上下文,同时添加@ConditionalOnPasswordManagement注解确保仅在密码管理功能开启时加载 - 无需修改CAS官方核心模块的源码,后续升级CAS版本时扩展逻辑不会受影响
- 如果需要校验当前密码的合法性,可以在校验逻辑中注入认证相关服务,验证输入的当前密码是否正确
内容的提问来源于stack exchange,提问作者ThatTallProgrammer
相关产品推荐
相关产品推荐

