Yii2 使用者使用登入元件token驗證

liaosp發表於2021-11-01

請新增圖片描述

當我在查閱 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 協議》,轉載必須註明作者和本文連結

相關文章