繁体   English   中英

PHP-LDAP 修改密码

[英]PHP-LDAP change password

我们使用 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个字符等......而且,脚本使用管理员帐户来更改密码。是否有任何其他方式来更新使用用户帐户的用户密码并验证密码安全配置?

根据您的代码,您似乎正在使用 Symfony 并且您有一个 Active Directory 服务器。

您的代码正在执行“密码重置”,如果用户忘记密码,管理员会执行此操作。 它需要管理权限并且不需要知道以前的密码,因此它不会强制执行以前的历史记录。

您要做的是“更改密码”。 unicodePwd的文档解释了如何执行此操作:

如果修改请求包含一个删除操作,该操作包含 unicodePwd 的值Vdel ,然后是一个包含 unicodePwd 的值Vadd的添加操作,则服务器认为该请求是更改密码的请求。 服务器使用本节后面介绍的密码解码过程对VaddVdel进行解码。 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),
]);

请注意,您必须以与编码新密码相同的方式对旧密码进行编码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM