![](/img/trans.png)
[英]Java with LDAP: change users password without administrative rights?
[英]Can I change myself Active Directory password from LDAP (without administrative account)
我不(也不會)擁有管理員帳戶。 我想從java更改Active Directory中的自己(用戶)密碼。 我怎樣才能做到這一點?
使用來自網絡的代碼:
private void changePass() throws Exception {
String oldpass = this.encodePassword("oldpass!");
String newpass = this.encodePassword("newpass!");
Attribute oldattr = new BasicAttribute("unicodePwd", oldpass);
Attribute newattr = new BasicAttribute("unicodePwd", newpass);
ModificationItem olditem = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, oldattr);
ModificationItem newitem = new ModificationItem(DirContext.ADD_ATTRIBUTE, newattr);
ModificationItem repitem = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, newattr);
ModificationItem[] mods = new ModificationItem[2];
mods[0] = olditem;
mods[1] = newitem;
// ldapTemplate.modifyAttributes("cn=administrator,cn=Users", mods);
ldapTemplate.modifyAttributes("cn=smith,cn=Users", new ModificationItem[] { repitem });
}
這是contextSource
<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
<property name="url" value="ldap://ldapserver:389"/>
<property name="base" value="dc=company,dc=com"/>
<property name="userDn" value="smith@company"/>
<property name="password" value="oldpass"/>
</bean>
我有:
LDAP: error code 32 - 0000208D: NameErr: DSID-0310020A, problem 2001 (NO_OBJECT), data 0, best match of:
'CN=Users,DC=company,DC=com'
如果我將userDn更改為“cn = smith”,我得到:
LdapErr:DSID-0C0903A9,評論:AcceptSecurityContext錯誤
也許我的問題是我不明白LDAP是如何工作的? 是否可以(使用用戶帳戶更改用戶密碼)? 並且,如果可能,我可以使用相同的權限檢查帳戶鎖定/過期嗎?
更新/解決
非常感謝你的幫助。 這對我來說也很有幫助。
對於未來的搜索者:
NO_OBJECT - 表示ACtive Directory無法找到對象(我的cn = Users,cn = Smith)要查找用戶目錄的完全限定的規范路徑,您可以使用用戶屬性“ distinguishedName ”(在我的,最惡劣的情況下,它是“ cn = John \\,史密斯“,ou =承包商,ou =用戶帳戶,ou =帳戶” )
然后我得到了:
WILL_NOT_PERFORM - 這可能意味着不同類型的事物。 在我的情況下,有錯誤的對象類型,但是,可能的其他情況,如下所述 - 不是SSL連接( 不是ldaps:// ),等等。
然后:
INSUFF_ACCESS_RIGHTS - 用戶(不是管理員無權使用REPLACE-password屬性),要更改密碼,必須輸入舊密碼和新密碼,然后REMOVE old和ADD new。
Attribute oldattr = new BasicAttribute("unicodePwd", oldQuotedPassword.getBytes("UTF-16LE"));
Attribute newattr = new BasicAttribute("unicodePwd", newQuotedPassword.getBytes("UTF-16LE"));
ModificationItem olditem = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, oldattr);
ModificationItem newitem = new ModificationItem(DirContext.ADD_ATTRIBUTE, newattr);
ldapTemplate.modifyAttributes("cn=John\\, Smith,ou=Contractors,ou=User Accounts,ou=Accounts", new ModificationItem[] { olditem, newitem });
問題1005(CONSTRAINT_ATT_TYPE) - 如果舊密碼錯誤
順便說一句
javax.naming.PartialResultException:未處理的Continuation Reference(s); 剩余名稱'/' - 搜索person / user global時(例如,在authenticate-method中)ldapTemplate.setIgnorePartialResultException( true ); 可以解決它
是的,你可以,但它有點棘手。
首先要更改密碼,您必須通過LDAPS而不是LDAP連接。 即使用TLS或SSL(至少128位)連接。 以下是如何使用JNDI完成此操作的示例。
其次,您必須將密碼作為UTF-16LE編碼的字節數組傳遞。 但在編碼之前,你應該用雙引號括起來。 所以這是一個例子:
String pass = "\"" + "newpass" + "\"";
byte[] password = pass.getBytes("UTF-16LE");
// You will need to handle UnsupportedEncodingException here
如果cn=smith,cn=Users
不是條目的真實DN,則需要。
你不需要刪除/添加/替換所有東西:只需使用REPLACE_ATTRIBUTE; 如果您使用管理帳戶更改密碼。
如果您要自己更新密碼,即在綁定到您正在更新的同一帳戶時,確實需要它。 原因是您必須提供舊密碼以進行刪除,並使用新密碼進行插入,以便可以檢測舊密碼的匹配失敗。 或者,您可以使用擴展密碼修改操作,其中您再次提供舊密碼和新密碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.