我正在尝试为我的应用程序创建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
。
目前这个网址正在返回我的表的整个数据。
我想要的是(认证后):
我尝试了但是没有得到任何线索来在验证后捕获返回的$identity
用户。
而且我知道这也是可行的。帮助我们让人们创造魔法。
答案 0 :(得分:1)
- 获取请求者的用户ID /用户名。
醇>
您在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.php或DeleteAction.php中的相同方式手动调用它。
- 正在返回整行,但我只想要很少..与...当前请求者/用户
匹配 醇>
这取决于您的数据结构。您可以覆盖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()]);
}