我正在尝试编写一个可以让用户在LDAP系统上管理用户的应用程序。其中一个功能是功能" 忘记密码"。
modifyAttributes(..)
)。pwdReset
设置为true
,表示密码已由管理员更改,必须由用户更改。 现在,我确实希望将其设置为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
答案 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
,你必须自己这样做。