我們使用 LDAP (Samba) 進行身份驗證,現在我想讓用戶能夠更改他們的密碼。我正在使用這個腳本:
$username = $request->request->get('username');
$oldpasswd = $request->request->get('oldpasswd');
$newpasswd = $request->request->get('newpasswd');
$userPassword = mb_convert_encoding('"'.$newpasswd.'"', 'utf-16le');
$ldapPasswd = $this->getParameter('LDAP_PASSWD');
$ldap->bind("CN=LDAPADMIN,CN=Users,DC=DOMAIN,DC=net", $ldapPasswd);
$query = $ldap->query('CN=users,DC=DOMAIN,DC=net', "(&(objectclass=person)(sAMAccountName=$username))");
$result = $query->execute()->toArray();
$entry = $result[0];
$newEntry = new Entry($entry->getDn(), [
'unicodePwd' => [$userPassword],
]);
$ldap->getEntryManager()->update($newEntry);
它作業正常,但是所有安全設定都無效:不要重復密碼,密碼長度> 6個字符等......而且,腳本使用管理員帳戶來更改密碼。是否有任何其他方式來更新使用用戶帳戶的用戶密碼并驗證密碼安全配置?
uj5u.com熱心網友回復:
根據您的代碼,您似乎正在使用 Symfony 并且您有一個 Active Directory 服務器。
您的代碼正在執行“密碼重置”,如果用戶忘記密碼,管理員會執行此操作。它需要管理權限并且不需要知道以前的密碼,因此它不會強制執行以前的歷史記錄。
您要做的是“更改密碼”。的檔案unicodePwd解釋了如何執行此操作:
如果修改請求包含含有值的洗掉操作VDEL為unicodePwd后跟包含的值的加法運算VADD為unicodePwd,服務器認為其請求是改變密碼的請求。服務器使用本節后面介紹的密碼解碼程序對Vadd和Vdel進行解碼。Vdel是舊密碼,而Vadd是新密碼。
在 LDAP 中,這稱為“批處理請求”,它包含洗掉指令和添加指令,所有這些都在對服務器的同一個請求中。Symfony 檔案包含一個關于如何進行批量更新的部分。在您的情況下,它應該如下所示:
$username = $request->request->get('username');
$oldpasswd = $request->request->get('oldpasswd');
$newpasswd = $request->request->get('newpasswd');
$oldUserPassword = mb_convert_encoding('"'.$oldpasswd.'"', 'utf-16le');
$userPassword = mb_convert_encoding('"'.$newpasswd.'"', 'utf-16le');
$ldapPasswd = $this->getParameter('LDAP_PASSWD');
$ldap->bind("CN=LDAPADMIN,CN=Users,DC=DOMAIN,DC=net", $ldapPasswd);
$query = $ldap->query('CN=users,DC=DOMAIN,DC=net', "(&(objectclass=person)(sAMAccountName=$username))");
$result = $query->execute()->toArray();
$entry = $result[0];
$entryManager->applyOperations($entry->getDn(), [
new UpdateOperation(LDAP_MODIFY_BATCH_REMOVE, 'unicodePwd', $oldUserPassword),
new UpdateOperation(LDAP_MODIFY_BATCH_ADD, 'unicodePwd', $userPassword),
]);
請注意,您必須以與編碼新密碼相同的方式對舊密碼進行編碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/408783.html
標籤:
