0

问题

目前正在寻找其他人在需要使用 验证密码功能userprincipalname而不是使用samaccountname.

如果您遇到任何具体问题,请在评论中提供反馈,以便我们更新文档。

当前实施

为了app/common/model/LoginForm

获取用户

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.');
        }
    }
}
4

1 回答 1

0

一个解法

这是一个解决方法,感谢 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,
                    ],
                ],

            ],

        ],
    ],
于 2017-09-17T16:53:58.610 回答