Php Yii2中的自定义身份验证问题
我已为Yi2 RESTful项目添加了自定义身份验证组件,它正在验证凭据,但没有将有效的用户对象返回到\Yii::$app->User 该组件如下所示: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
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',所以在使用您展示的回调方法时有点迷失。我不能在自定义身份验证组件和模型中保留逻辑吗?您可以分别将配置传递给每个包含身份验证的方法。看这里