Yii2休息:在restAction上检查访问

时间:2018-02-07 15:05:21

标签: rest yii2

在处理this other question之后,我们现在想检查经过身份验证的用户是否可以查看,更新或删除现有记录。由于checkAccess()默认情况下会在所有restAction中调用,因此以下似乎是最合乎逻辑的尝试:

public function checkAccess($action, $model = null, $params = []) {
    if(in_array($action, ['view', 'update', 'delete'])) {
        if(Yii::$app->user->identity->customer->id === null
         || $model->customer_id !== Yii::$app->user->identity->customer->id) {
            throw new \yii\web\ForbiddenHttpException('You can\'t '.$action.' this item.');
        }
    }
}

但API似乎忽略了这个功能。我们在控制器中添加了这个功能。操作(查看,更新和删除)是默认的restAction

我们的BaseController设置了以下操作:

...
'view' => [
    'class' => 'api\common\components\actions\ViewAction',
    'modelClass' => $this->modelClass,
    'checkAccess' => [$this, 'checkAccess'],
    'scenario' => $this->viewScenario,
],
...

我们忘记了什么吗?

2 个答案:

答案 0 :(得分:1)

我们显然应该看到viewAction不是默认值,而是更改api\common\components\actions\ViewAction ...不确定我们是如何错过的......

答案 1 :(得分:1)

在执行任何其他代码之前,只需在自定义操作中添加以下内容,就像在默认视图操作(see source code here)中完成一样:

if ($this->checkAccess) {
    call_user_func($this->checkAccess, $this->id, $model);
}

注意:$this->checkAccess在父yii\rest\Action中定义,因此您的自定义ActionView类需要扩展yii\rest\Action或重新定义变量public $checkAccess; < / p>