Yii:如何使用userprincipalname而不是samaccountname

时间:2017-09-17 16:53:59

标签: yii2 adldap

问题

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

  

如果您正在努力,请在评论中提供反馈   我们可以更新文档。

当前实施

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()

目前,以下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.');
        }
    }
}

1 个答案:

答案 0 :(得分:0)

解决方案

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

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

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

validatePassword()w / userprincipalname

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