防止来自其他用户的节目数据

时间:2015-02-18 21:51:42

标签: yii2

如何防止所有detailView显示来自其他用户的数据?

例如,当您在URL中键入其他用户的产品ID时会发生这种情况。 detailView通常显示产品的详细信息,但是属于另一个用户,甚至可以更改并删除它。

3 个答案:

答案 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