如何使用Adldap2 laravel包更改AD用户密码



我想更改AD中用户的密码,因为AD中没有密码的属性。

目前正在运行带有Adldap2 laravel包的laravel框架,以便管理ADLDAP操作。

这是我的ldap_auth.php

<?php
return [
'connection' => env('LDAP_CONNECTION', 'default'),
'provider' => AdldapLaravelAuthDatabaseUserProvider::class,
'model' => AppUser::class,
'rules' => [
AdldapLaravelValidationRulesDenyTrashed::class,
],
'scopes' => [
AdldapLaravelScopesUidScope::class
],
'identifiers' => [
'ldap' => [
'locate_users_by' => 'uid',
'bind_users_by' => 'dn',
],
'database' => [
'guid_column' => 'objectguid',
'username_column' => 'username',
],
'windows' => [
'locate_users_by' => 'samaccountname',
'server_key' => 'AUTH_USER',
],
],
'passwords' => [
'sync' => env('LDAP_PASSWORD_SYNC', false),
'column' => 'password',
],
'login_fallback' => env('LDAP_LOGIN_FALLBACK', false),
'sync_attributes' => [
'username' => 'uid',
'password' => 'userPassword',
'name' => 'cn',
'role' => 'l',
'category' => 'businessCategory',
'telephone_number' => 'telephoneNumber',
'email' => 'mail'
],
'logging' => [
'enabled' => env('LDAP_LOGGING', true),
'events' => [
AdldapLaravelEventsImporting::class                 => AdldapLaravelListenersLogImport::class,
AdldapLaravelEventsSynchronized::class              => AdldapLaravelListenersLogSynchronized::class,
AdldapLaravelEventsSynchronizing::class             => AdldapLaravelListenersLogSynchronizing::class,
AdldapLaravelEventsAuthenticated::class             => AdldapLaravelListenersLogAuthenticated::class,
AdldapLaravelEventsAuthenticating::class            => AdldapLaravelListenersLogAuthentication::class,
AdldapLaravelEventsAuthenticationFailed::class      => AdldapLaravelListenersLogAuthenticationFailure::class,
AdldapLaravelEventsAuthenticationRejected::class    => AdldapLaravelListenersLogAuthenticationRejection::class,
AdldapLaravelEventsAuthenticationSuccessful::class  => AdldapLaravelListenersLogAuthenticationSuccess::class,
AdldapLaravelEventsDiscoveredWithCredentials::class => AdldapLaravelListenersLogDiscovery::class,
AdldapLaravelEventsAuthenticatedWithWindows::class  => AdldapLaravelListenersLogWindowsAuth::class,
AdldapLaravelEventsAuthenticatedModelTrashed::class => AdldapLaravelListenersLogTrashedModel::class,
],
],
];

这是我的LdapController.php,其中包括重置密码的功能

public function resetPassword(Request $req)
{
$req->validate([
'userid' => 'required',
'password' => 'required|min:6|confirmed'
]);
$userLdap = Adldap::search()->where('uid', $req->userid)->firstOrFail();
$newPassword = "{SHA}" . base64_encode(pack("H*", sha1($req->password)));
$res = $userLdap->update([
'userpassword' => $newPassword
]);
//Force change AD Password
// $adPassword = str_replace("n", "", shell_exec("echo -n '"" . $req->password . ""' | recode latin1..utf-16le/base64"));
// $provider = AdldapModelsUser::connect('ad');
// $dn = $provider->search()->where('cn', $req->userid)->get();
// $res = $dn->setPassword($adPassword);
if ($res) {
return back()->withSuccess('<strong>Success!</strong> Your password has been changed');
} else {
return back()->withErrors('<strong>Failed!</strong> Your password was unable to changed');
}
}

不幸的是$res=$dn->setPassword($adPassword(;返回错误"Method Adldap\Query\Collection::setPassword不存在">

当我在谷歌上搜索"Adldap2 laravel change password"时,我在这里找到了一个例子。

$user = Adldap::users()->find('jdoe');
if ($user instanceof AdldapModelsUser) {
$oldPassword = 'password123';
$newPassword = 'correcthorsebatterystaple';
$user->changePassword($oldPassword, $newPassword);
}

如果你想重置密码,那么这似乎应该有效:

$user->setPassword("correcthorsebatterystaple");
$user->save();

如果你想知道下面发生了什么,或者如果没有Adldap2 laravel:

属性为unicodePwd。您可以"更改"密码,也可以"重置"密码。

更改密码需要知道旧密码。这是用户自己会做的事情。

重置密码需要对帐户具有"重置密码"权限,该权限通常授予管理帐户。

unicodePwd的文档告诉您如何同时执行这两项操作。对于"更改",您可以在同一请求中发送带有旧密码的删除指令和带有新密码的添加指令。

对于重置,您发送一条替换指令。

在这两种情况下,密码都必须以特定的格式发送。

"ldap_modify_batch"的PHP文档显示了如何更改密码的示例。

ldap_mod_replace的文档页面上,有一条注释向您展示了如何重置密码。

最新更新