在处理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,
],
...
我们忘记了什么吗?
答案 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>