You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WSO2 APIM 4.4中强制修改密码时校验旧密码?

实现WSO2 APIM 4.4密码修改时新旧密码对比策略(无需Identity Server)

一、后端自定义密码验证器实现

WSO2 APIM的密码校验逻辑可通过扩展Carbon的PasswordValidator接口实现,以下是具体步骤:

  1. 创建自定义验证类
    编写Java类继承AbstractPasswordValidator,重写validate方法,加入新旧密码对比逻辑:
import org.wso2.carbon.identity.mgt.policy.AbstractPasswordValidator;
import org.wso2.carbon.identity.mgt.policy.PasswordPolicyException;
import org.wso2.carbon.user.core.UserStoreException;
import org.wso2.carbon.user.core.UserStoreManager;
import org.wso2.carbon.user.core.util.UserCoreUtil;

import java.util.Map;

public class OldPasswordCheckValidator extends AbstractPasswordValidator {

    @Override
    public void validate(String userName, String newPassword, Map<String, Object> context) throws PasswordPolicyException {
        // 从上下文获取旧密码参数
        String oldPassword = (String) context.get("oldPassword");
        
        if (newPassword.equals(oldPassword)) {
            throw new PasswordPolicyException("新密码不能与旧密码相同");
        }

        // 保留原有复杂度校验逻辑(按需选择)
        super.validate(userName, newPassword, context);
    }

    @Override
    public boolean isPolicyCompliant(String userName, String newPassword, Map<String, Object> context) throws PasswordPolicyException {
        try {
            UserStoreManager userStoreManager = UserCoreUtil.getRealmService().getTenantUserRealm(UserCoreUtil.getTenantId(userName)).getUserStoreManager();
            // 验证用户输入的旧密码是否有效
            if (!userStoreManager.authenticate(userName, (String) context.get("oldPassword"))) {
                throw new PasswordPolicyException("旧密码不正确");
            }
            return !newPassword.equals(context.get("oldPassword"));
        } catch (UserStoreException e) {
            throw new PasswordPolicyException("验证旧密码失败", e);
        }
    }
}
  1. 打包部署
    将编译后的类打包成JAR文件,放入APIM服务器的<APIM_HOME>/repository/components/dropins目录。

  2. 配置启用自定义验证器
    修改<APIM_HOME>/repository/conf/identity/identity.xml文件,在<PasswordValidation>节点下添加自定义验证器配置:

<PasswordValidation>
    <!-- 保留原有默认验证器配置 -->
    <Validator className="org.wso2.carbon.identity.mgt.policy.DefaultPasswordValidator"/>
    <!-- 添加自定义新旧密码验证器 -->
    <Validator className="com.your.package.OldPasswordCheckValidator"/>
</PasswordValidation>

二、前端页面优化(可选)

为提升用户体验,可在Publisher/Devportal的密码修改页面添加前端校验,提前拦截错误输入:

  1. 修改Publisher密码页面
    找到<APIM_HOME>/repository/deployment/server/jaggeryapps/publisher/site/blocks/user/profile/edit-password/edit-password.jag文件,在表单提交逻辑中添加校验:
// 在表单提交前插入校验逻辑
var oldPassword = document.getElementById('oldPassword').value;
var newPassword = document.getElementById('newPassword').value;
if (newPassword === oldPassword) {
    alert('新密码不能与旧密码相同');
    return false;
}
  1. 修改Devportal密码页面
    同理,修改<APIM_HOME>/repository/deployment/server/jaggeryapps/devportal/site/blocks/user/profile/edit-password/edit-password.jag文件,添加相同的前端校验逻辑。

三、验证效果

重启APIM服务器,登录Publisher或Devportal进入密码修改页面,输入与旧密码相同的新密码,系统会返回自定义错误提示,阻止密码修改操作。

内容的提问来源于stack exchange,提问作者m.feyzollahi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:22:16