如何防止所有detailView显示来自其他用户的数据?
例如,当您在URL中键入其他用户的产品ID时会发生这种情况。 detailView通常显示产品的详细信息,但是属于另一个用户,甚至可以更改并删除它。
答案 0 :(得分:1)
有几种选择:
1)最简单的一个,在显示视图之前在控制器中检查当前用户是否可以看到产品。如果他不能将他(通过抛出错误)重定向到404页面(或者你想要显示的任何错误)
2)使用RBAC设置角色以及这些角色可以做什么。这是最专业的选择
3)您也可以修改accessfilter来执行此操作
如果您需要询问如何执行此操作,请使用选项1。
如果您希望通过阅读此http://www.yiiframework.com/doc-2.0/guide-security-authorization.html
开始选项2或3答案 1 :(得分:1)
Mihai建议的一个例子。
public function behaviors()
{
return [
'accessControl' => [
'class' => \yii\filters\AccessControl::className(),
'rules' => [
[
'actions' => ['view'],
'allow' => true,
'matchCallback' => function () {
$request = \Yii::$app->request;
$user = \Yii::$app->user->identity;
$product = Product::findOne($request->get('id'));
if ($user && $product->owner_id == $user->id) {
return true;
}
return false;
}
],
[
'allow' => false,
'roles' => ['*'],
],
],
]
];
}
答案 2 :(得分:1)
如果您不想使用RBAC,可以在控制器中执行以下操作:
protected function findModel($id)
{
//Check if the author is the current user
if (($model = Product::findOne($id)) !== null && $model->author_id==Yii::$app->user->id) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}
就像这个不是作者的用户无法查看,更新或删除产品。 http://www.yiiframework.com/forum/index.php/topic/61915-prevent-show-data-from-another-user/page__view__findpost__p__274644