使用QueryParamAuth身份验证器的REST Api - Yii2

时间:2016-04-04 12:44:01

标签: rest yii2 restful-authentication

我正在尝试为我的应用程序创建rest api以获取我的Android应用程序中的数据。这是我的控制器

<?php

namespace api\modules\v1\controllers;

use yii\rest\ActiveController;
use yii\filters\auth\QueryParamAuth;

/**
 * Tk103 Controller API
 */
class Tk103Controller extends ActiveController
{
    public $modelClass = 'api\modules\v1\models\Tk103CurrentLocation';  

    public function behaviors()
    {
        $behaviors = parent::behaviors();
        $behaviors['authenticator'] = [
            'class' => QueryParamAuth::className(),
        ];
        return $behaviors;
    }  

}

我在用户表格中添加了access_token列,在用户模型中实施了findIdentityByAccessToken()并调用了此网址 http://localhost:7872/api/v1/tk103s?access-token=abcd

当且仅当access_token与表格中的任何单个用户匹配时,此功能才能正常运行并返回数据。 我检查了QueryParamAuth类,发现QueryParamAuth::authenticate()在成功验证后返回$identity

目前这个网址正在返回我的表的整个数据。

我想要的是(认证后):

  1. 获取请求者的用户ID /用户名。
  2. 根据该id / username,根据db中的表关系,与他相关的数据。 (目前正在返回整行,但我只想要几个与当前请求者/用户匹配的行)
  3. 我尝试了但是没有得到任何线索来在验证后捕获返回的$identity用户。 而且我知道这也是可行的。帮助我们让人们创造魔法。

1 个答案:

答案 0 :(得分:1)

  
      
  1. 获取请求者的用户ID /用户名。
  2.   

您在findIdentityByAccessToken方法中返回的用户实例应该可以在Yii::$app->user->identity内的应用内任意位置访问。并且应该保留从DB中检索的所有属性。这是一个快速示例,用于在 ActiveController 类的 checkAccess 方法中检查访问权限:

public function checkAccess($action, $model = null, $params = [])
{
    // only an image owner can request the related 'delete' or 'update' actions
    if ($action === 'update' or $action === 'delete') {
        if ($model->user_id !== \Yii::$app->user->identity->id)
            throw new \yii\web\ForbiddenHttpException('You can only '.$action.' images that you\'ve added.');
    }
}

请注意,checkAccess默认为empty method,在ActiveController中的所有内置操作中手动调用。想法是在从DB中检索动作ID和模型实例之后将动作ID和模型实例传递给它,然后再修改它,这样我们就可以进行额外的检查。如果您只需要按操作ID执行检查,那么yii\filters\AccessControl可能就足够了,但在checkAccess内您也希望获得模型实例本身,因此在构建自己的操作或覆盖时必须注意现有的。请务必按照UpdateAction.phpDeleteAction.php中的相同方式手动调用它。

  
      
  1. 正在返回整行,但我只想要很少..与...当前请求者/用户
  2. 匹配   

这取决于您的数据结构。您可以覆盖ActiveController的操作以在输出结果之前对其进行过滤,如果您使用的话,可以在相关的 SearchModel 类中处理,也可以在模型中处理即可。快速提示可以简单地覆盖模型中的查找方法:

public static function find()
{
    return parent::find()->where(['user_id' => Yii::$app->user->getId()]); // or Yii::$app->user->identity->id
}

请注意,仅在使用ActiveRecord时才有效。这意味着使用它时:

$images = Image::find()->all();

默认情况下,我们刚刚覆盖的find方法会在生成数据库查询之前始终包含where条件。另请注意 ActiveController 中的默认内置操作正在使用ActiveRecords,但如果您正在使用Query Builder构建SQL查询的操作,那么您应该手动进行过滤。

如果使用ActiveQuery(可能更好地解释here),可以这样做:

public static function find()
{
    $query = new \app\models\Image(get_called_class());
    return $query->andWhere(['user_id' => Yii::$app->user->getId()]);
}