0

我有一个用于更改登录用户密码的 portlet。用户必须输入当前密码和两次新密码。它调用 LoginService.checkPassword(String userId, char[] password) 来确定现有密码是否正确。如果此方法返回 true,则通过 Puma Profile 获取当前用户并使用 PumaController.setAttributes(User user, Map attributes) 调用设置更新后的属性来更新密码。然后通过 PumaProfile.reload 方法重新加载 puma 配置文件(我也尝试过使用 PumaController.reload() 方法。

我面临的问题是 LoginService.checkPassword(String userId, char[] password) 为当前密码和旧密码返回 true,而不仅仅是当前密码。有谁知道为什么会这样?

在 ldap 中,密码字段是单个属性字段,在 wimdomain.xml 中也是如此,如果我注销并尝试登录,我只能使用当前密码登录(如您所料)。

4

2 回答 2

0

发现这是门户网站的一个错误。即使您使用开箱即用的配置文件编辑 portlet,您也会遇到同样的问题

于 2013-05-24T11:29:53.477 回答
0

验证 Websphere Portal 用户密码 验证用户密码的方法有两种 -

1)使用“用户注册表”

public static boolean checkUserAuthenticatedLDAP(String userId, String password) {
    try {
        Context ctx = new InitialContext();
        com.ibm.websphere.security.UserRegistry reg =
            (com.ibm.websphere.security.UserRegistry) ctx.lookup("UserRegistry");

        String res = reg.checkPassword(userId, password);

        return res != null;
    } catch (Exception ex) {
        return false;
    }
}

2)使用“登录上下文”

/**
 * This method validates the user based on the user id and password
 * attributes, If the user id or password is not valid then throws Exception.
 *
 * @param userId
 * @param password
 * @return boolean
 * @throws Exception
 */
public boolean checkUserAuthenticated(String userId, String password) throws Exception {
    javax.security.auth.login.LoginContext loginContext = null;

    Subject subject = null;

    try {
        loginContext = new javax.security.auth.login.LoginContext("WSLogin",
            new com.ibm.websphere.security.auth.callback.WSCallbackHandlerImpl(userId, password));
    } catch (javax.security.auth.login.LoginException e) {
        throw new Exception("Cannot create LoginContext", e);
    }

    try {
        loginContext.login();

        subject = loginContext.getSubject();
    } catch (com.ibm.websphere.security.auth.WSLoginFailedException e) {
        throw new Exception("Password is incorrect", e);
    } catch (Exception e) {
        throw new Exception("Unknown username", e);
    }

    if (subject == null)
        throw new Exception("Password is incorrect");

    return true;
}
于 2014-02-04T07:18:24.987 回答