0

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

  1. 用户使用我的应用程序重置他的密码
  2. 我问了一些安全问题,如果它们是正确的,我会将他重定向到新屏幕 - 新密码屏幕。
  3. 用户只提供新密码(因为他忘记了旧密码)
  4. 我使用 admin Context 并重置用户密码(使用modifyAttributes(..))。
  5. LDAP 系统,设置pwdResettrue指示密码已由管理员更改,必须由用户更改。

现在,我确实想将其设置为 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);

在此处输入图像描述

这是我的pwdPolicy

在此处输入图像描述 在此处输入图像描述

4

1 回答 1

0

我刚刚花了两周时间向自己证明 OpenLDAP 实际上根本没有执行第 5 步,尽管 RFC 草案的措辞似乎是什么意思。我还在 OpenLDAP Mail 档案中发现了一条消息,确认他们认为不应该这样做。所以发生的事情是没有pwdReset属性设置为 false,所以你会遇到模式冲突,试图用该值添加它。所以,你所要做的就是什么都不做。

将其设置为 null 可能会更安全pwdReset,这会完全删除它,或者只是使用DirContext.REMOVE_ATTRIBUTE. 我的代码没有使用ModificationItem,这是另一个线索,更像是:

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

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

于 2016-12-16T07:49:32.527 回答