Yii:如何使用 userprincipalname 而不是 samaccountname 验证 Edvlerblog\Adldap2 的密码

Yii: How to validatePassword with Edvlerblog\Adldap2 using userprincipalname instead of samaccountname

问题

目前正在寻找其他人在需要使用 userprincipalname 而不是使用 samaccountname.[=19= 的 Edvlerblog\Adldap2 validatePassword 函数进行身份验证时如何处理验证密码功能]

Please provide feedback in the comments if you are struggling with anything specific so we can update the documentation.

当前实施

对于app/common/model/LoginForm

getUser

Edvlerblog\Adldap2 getUser() 函数有效,甚至缓存 queryLdapUserObject,允许您获取任何 AD 属性。

protected function getUser()
{
    if ($this->_user === null) {
        $this->_user = \Edvlerblog\Adldap2\model\UserDbLdap::findByUsername($this->username);
    }

    return $this->_user;
}

验证密码()

目前,以下 validatePassword 函数对我不起作用,因为在我的实例中,AD 必须根据 userprincipalname 而不是 samaccount 名称进行身份验证。

public function validatePassword($attribute, $params)
{
    if (!$this->hasErrors()) {
        $user = $this->getUser();
        if (!$user || !$user->validatePassword($this->password)) {
            $this->addError($attribute, 'Incorrect username or password.');
        }
    }
}

一个解决方案

感谢 Edvlerblog\Adldap2 最近发布的 3.0.5 解决了几个问题并在他的自述文档中提供了一些示例,这是一个解决方法。

请注意 findByAttribute() 的添加,允许以下内容:

 $this->_user = \Edvlerblog\Adldap2\model\UserDbLdap::findByUsername($this->username);

validatePassword() w/ userprincipalname

更新您的登录模型:common\models\LoginForm.php

public function validatePassword($attribute, $params)
{
    if (!$this->hasErrors()) {
        $user = $this->getUser();
        if (!$user) {
            $this->addError('username', 'Incorrect username.');
        } else {
            // Note: queryLdapUserObject is a cached object, 
            // so the ldap fetch does not get called :-).
            $userprincipalname = $this->_user->queryLdapUserObject()->getAttribute('userprincipalname');
            $auth = Yii::$app->ad->auth()->attempt($userprincipalname[0], $this->password);
            if (!$auth) {
                $this->addError('password', 'Incorrect password.');
            }
        }
    }
}

getUser() w/userprincipalname

    /**
     * Finds user by [[username]]
     *
     * @return User|null
     */
    protected function getUser()
    {
        if ($this->_user === null) {
            $this->_user = \Edvlerblog\Adldap2\model\UserDbLdap::findByUsername($this->username);
        }

        return $this->_user;
    }

Yii2 ldap 组件配置

参考:https://github.com/Adldap2/Adldap2/blob/master/docs/configuration.md

在您的 frontend\config\main 中配置:

'components' => [
        'log' => [... ],
        'authManager' => [... ],
        'ad' => [
            'class' => 'Edvlerblog\Adldap2\Adldap2Wrapper',
            'providers' => [
                'default' => [
                    'autoconnect' => true,
                    'config' => [
                        'domain_controllers' => ['your.ldap.domain.com'],
                        'base_dn'            => "OU=XXX,OU=XXX,DC=ccccccc,DC=xxxx,DC=com",
                        'admin_username'     => "your_username",
                        'admin_password'     => "your_password",
                        'port'               => 389,
                    ],
                ],

            ],

        ],
    ],