我需要从名为pwdAccountLockedTime
我跟着this Q&A建议使用方式2:
直接使用LdapTemplate#modifyAttributes(Name, ModificationItem[])
,手动构建ModificationItem
数组。
这是我的代码:
Name dn = buildDn(user);
DirContextOperations context = ldapTemplate.lookupContext(dn);
ModificationItem[] modificationItems;
modificationItems = new ModificationItem[1];
modificationItems[0] = new ModificationItem(DirContextAdapter.REMOVE_ATTRIBUTE,
new BasicAttribute(
"pwdAccountLockedTime", dn));
ldapTemplate.modifyAttributes(dn,modificationItems);
我检查了用户,那个属性仍然存在。
我错过了什么?
答案 0 :(得分:2)
如果要删除pwdAccountLockedTime属性,则在配置LDAP时必须指定管理员凭据。用户无权删除操作属性。您可以参考以下代码。
Name dn = buildDn(pvo);
DirContextOperations context = ldapTemplate.lookupContext(dn);
ModificationItem[] modificationItems;
modificationItems = new ModificationItem[1];
modificationItems[0] =new ModificationItem(DirContext.REMOVE_ATTRIBUTE, new BasicAttribute("pwdAccountLockedTime"));
ldapTemplate.modifyAttributes(dn,modificationItems);
注意:buildDn()是一个单独的方法。
protected Name buildDn(PersonVo p) {
return LdapNameBuilder.newInstance(BASE_DN)
.add("","") // add your root
.add("", "") // add your root
.add("cn", p.getFullname())
.build();
}
我正在从邮递员那里获取PersonVo对象,因为我正在构建Dn。
这是配置代码
@配置 公共类Config {
@Bean
public LdapContextSource ldapContextSource()
{
LdapContextSource lcs= new LdapContextSource();
lcs.setUrl("Your url");
lcs.setUserDn("yourDn");
lcs.setPassword("yourpassword");
return lcs;
}
}
如果您不指定管理员凭据,则此代码无效
答案 1 :(得分:0)
你没有。操作属性适用于LDAP服务器,而不适用于应用程序。它们对应用程序是只读的。
但是,管理员帐户可以更改此特定属性。改变它的唯一方法是锁定到期。否则only a password administrator can unlock the account:见#5.3.3。
答案 2 :(得分:0)
您的意图似乎是解锁已被OpenLdap中的错误密码尝试过多锁定的帐户。
如果用户帐户被锁定(pwdLockout为TRUE),则可能使用以下任一过程unlocked by an administrator:
删除操作属性pwdAccountLockedTime。此过程允许用户继续使用当前密码,仅在密码未过期时才有效。
添加操作属性pwdReset,其值为TRUE或FALSE。 FALSE仅在密码未过期且与删除pwdAccountLockedTime具有相同效果时才有效。
在大多数openLDAP版本中,您可以删除pwdAccountLockedTime。
某些版本可能需要使用ManageDIT控件。假设您拥有适当的权限,这两个都可以。
根据rfc4512第3.4节,“并非所有操作属性都是用户可修改的。”
-Jim