Php Yii2中的自定义身份验证问题

Php Yii2中的自定义身份验证问题,php,yii,yii2,Php,Yii,Yii2,我已为Yi2 RESTful项目添加了自定义身份验证组件,它正在验证凭据,但没有将有效的用户对象返回到\Yii::$app->User 该组件如下所示: public function authenticate($user, $request, $response) { $bearerToken = \Yii::$app->getRequest()->getQueryParam('bearer_token'); $user = Account::findIdent

我已为Yi2 RESTful项目添加了自定义身份验证组件,它正在验证凭据,但没有将有效的用户对象返回到\Yii::$app->User

该组件如下所示:

public function authenticate($user, $request, $response) {

    $bearerToken = \Yii::$app->getRequest()->getQueryParam('bearer_token');

    $user = Account::findIdentityByAccessToken($bearerToken);

    return $user;
}
public static function findIdentityByAccessToken($token, $userType = null) {

    return static::findOne(['bearer_token' => $token]);
}
帐户模型方法如下所示:

public function authenticate($user, $request, $response) {

    $bearerToken = \Yii::$app->getRequest()->getQueryParam('bearer_token');

    $user = Account::findIdentityByAccessToken($bearerToken);

    return $user;
}
public static function findIdentityByAccessToken($token, $userType = null) {

    return static::findOne(['bearer_token' => $token]);
}
在authenticate()方法中调试时,我可以看到$user是预期的帐户记录,但是\Yii::app()->user似乎是新安装的用户\Yii::app()->user->identity等于null


有人知道我做错了什么吗?

要登录用户,这还不够:

Account::findIdentityByAccessToken($bearerToken);
您需要调用
$user->login($identity)
内部
authenticificate()
。例如,请参见如何在中实现它:

因此,您也可以在自定义身份验证方法中调用它:

$identity = $user->loginByAccessToken($accessToken, get_class($this));
<?php

namespace api\components;

use yii\filters\auth\AuthMethod;

class HttpPostAuth extends AuthMethod
{
    /**
     * @see yii\filters\auth\HttpBasicAuth
     */
    public $auth;

    /**
     * @inheritdoc
     */
    public function authenticate($user, $request, $response)
    {
        $username = $request->post('username');
        $password = $request->post('password');

        if ($username !== null && $password !== null) {
            $identity = call_user_func($this->auth, $username, $password);
            if ($identity !== null) {
                $user->switchIdentity($identity);
            } else {
                $this->handleFailure($response);
            }
            return $identity;
        }

        return null;
    }
}
例如,请参见如何在中实现它

您还需要返回
$identity
,而不是
$user
。此外,代码中缺少处理失败。查看如何在内置的身份验证方法中实现它:

更多官方文件:

更新:

没有什么强迫您使用
loginByAccessToken()
,我只是举了一个例子

下面是我不久前编写的自定义身份验证方法的一个示例,不确定它是否100%安全和正确,但我希望它可以帮助您了解以下详细信息:

自定义身份验证方法:

$identity = $user->loginByAccessToken($accessToken, get_class($this));
<?php

namespace api\components;

use yii\filters\auth\AuthMethod;

class HttpPostAuth extends AuthMethod
{
    /**
     * @see yii\filters\auth\HttpBasicAuth
     */
    public $auth;

    /**
     * @inheritdoc
     */
    public function authenticate($user, $request, $response)
    {
        $username = $request->post('username');
        $password = $request->post('password');

        if ($username !== null && $password !== null) {
            $identity = call_user_func($this->auth, $username, $password);
            if ($identity !== null) {
                $user->switchIdentity($identity);
            } else {
                $this->handleFailure($response);
            }
            return $identity;
        }

        return null;
    }
}

指定
$auth
可调用也可以在
HttpBasicAuth
中找到,谢谢。你帮我澄清了。我没有意识到我的auth方法应该调用内置的loginByAccessToken(),它反过来会调用我定制的findIdentityByAccessToken()方法。我可以按用户名和密码进行同样的查找,因为我也想自定义它吗?我找不到与loginByAccessToken()等效的方法。没有什么强迫您完全使用该方法。我只是举个例子。我用另一个例子更新了答案。谢谢。但是,我有两个auth方法,因此使用class='composite',所以在使用您展示的回调方法时有点迷失。我不能在自定义身份验证组件和模型中保留逻辑吗?您可以分别将配置传递给每个包含身份验证的方法。看这里