LDAP:如何重置pwdReset字段的值

时间:2016-12-16 07:23:24

标签: java ldap tivoli

我正在尝试编写一个可以让用户在LDAP系统上管理用户的应用程序。其中一个功能是功能" 忘记密码"。

  1. 用户使用我的应用重置密码
  2. 我问了一些安全问题,如果它们是正确的,我会将他重定向到新的屏幕 - 新的密码屏幕。
  3. 用户仅提供新密码(因为他忘记了旧密码)
  4. 我使用管理员上下文并重置用户密码(使用modifyAttributes(..))。
  5. LDAP系统,将pwdReset设置为true,表示密码已由管理员更改,必须由用户更改。
  6. 现在,我确实希望将其设置为false,因为我不希望用户再次更改密码(正如他在上面的步骤中所做的那样),所以我明确地将其修改为false。但我得到错误

    javax.naming.directory.SchemaViolationException: [LDAP: error code 65 - Object Class Violation]; remaining name 'cn=XXXX,ou=XXXXOU,O=XXXX'
    

    有什么方法?还有其他选择吗?

    有关参考,重置pwdReset的代码如下:

            List<ModificationItem> modsList = new ArrayList<ModificationItem>();
            BasicAttribute attribute = new BasicAttribute(ATTR_PASSWORDRESET, "false");
            modsList.add(new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attribute));
            ModificationItem [] modsArr = modsList.toArray(new ModificationItem[modsList.size()]);
            modsArr = modsList.toArray(new ModificationItem[modsList.size()]);
            this.adminCtx.modifyAttributes(userName, modsArr);
    

    enter image description here

    这是我的pwdPolicy

    enter image description here enter image description here

1 个答案:

答案 0 :(得分:0)

我花了两周的时间向自己证明OpenLDAP实际上并没有真正完成第5步,尽管RFC草案的措辞似乎意味着什么。我在OpenLDAP邮件档案中发现了一条消息,确认他们认为不应该这样做。所以发生的事情是没有pwdReset属性设置为false,因此您尝试使用该值添加来获取架构违规。所以,你所要做的就是一无所获。

pwdReset设置为null(将其完全删除)或仅使用DirContext.REMOVE_ATTRIBUTE删除它可能会更安全。我的代码不使用ModificationItem,这是另一条线索,更像是:

BasicAttributes attributes = new BasicAttributes(ATTR_PASSWORDRESET, null);
this.adminCtx.modifyAttributes(userName, attrs);

以上也意味着如果你想将它设置为TRUE,你必须自己这样做。