當我在查閱 Yii文件的行為中,看到:
yii\behaviors\BlameableBehavior - 使用當前使用者 ID 自動填充指定的屬性。
在Laravel 中,獲取認證使用者呼叫的是Auth::user 即可獲取當前登入使用者。
在Yii中,使用者這塊文件中好像沒有看到,做一下記錄。
在繼承的Controller中建立一個 guard
,在Yii 中用行為可實現:
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['authenticator'] = [
'class' => UserAuthenticate::className(),
];
return $behaviors;
}
在專案中 建立上述UserAuthenticate
:
use yii\filters\auth\AuthMethod;
class UserAuthenticate extends AuthMethod
{
public $tokenParam = 'acc_token';
public function authenticate($user, $request, $response)
{
$accessToken = $request->get($this->tokenParam);
if (is_string($accessToken)) {
$identity = $user->loginByAccessToken($accessToken, get_class($this));
if ($identity !== null) {
return $identity;
}
}
if ($accessToken !== null) {
$this->handleFailure($response);
}
return null;
}
}
在控制器觸發的時候,會呼叫該方法。
在 main.php 配置,提供驗證的類。
'user' => [
'identityClass' => 'api\models\User',
],
<?php
namespace api\models;
use Yii;
use yii\base\NotSupportedException;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
class User extends ActiveRecord implements IdentityInterface {
/**
* @inheritdoc
*/
public static function tableName()
{
return 'users';
}
/**
* @inheritdoc
*/
public static function findIdentity($id)
{
return static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]);
}
/**
* @inheritdoc
*/
public static function findIdentityByAccessToken($token, $type = null)
{
return static::findOne(['access_token' => $token]);
}
//這個就是我們進行yii\filters\auth\QueryParamAuth呼叫認證的函式,下面會說到。
public function loginByAccessToken($accessToken, $type) {
//查詢資料庫中有沒有存在這個token
return static::findIdentityByAccessToken($token, $type);
}
/**
* Finds user by username
*
* @param string $username
* @return static|null
*/
public static function findByUsername($username)
{
return static::findOne(['username' => $username, 'status' => self::STATUS_ACTIVE]);
}
/**
* @inheritdoc
*/
public function getId()
{
return $this->getPrimaryKey();
}
/**
* @inheritdoc
*/
public function getAuthKey()
{
return $this->auth_key;
}
/**
* @inheritdoc
*/
public function validateAuthKey($authKey)
{
return $this->getAuthKey() === $authKey;
}
}
loginByAccessToken()
這個函式是我們需要自己定義的函式,因為這個函式在yii\filters\auth\QueryParamAuth
的認證類中會呼叫。
而findIdentityByAccessToken($token, $type = null)
這個是介面函式,我們需要實現的,所以就在loginByAccessToken()
這個函式中呼叫他去查詢資料表中有沒有對應的token存在,這個就是認證過程。
專案中可以使用 \Yii::$app->user->id
獲取使用者id
參考:
Yii官網
yii2框架-restful的請求引數token驗證
本作品採用《CC 協議》,轉載必須註明作者和本文連結