防止用户在Yii中查看其他用户个人资料

时间:2015-05-16 14:56:33

标签: php yii

我对我的应用有疑问。如何阻止用户查看其他用户个人资料? 我的意思是,用户只能查看自己的个人资料。如果用户123已登录,则允许他在'view& id = 123'中但在'view& id = 234'等中被拒绝。

我知道如何从视图页面执行此操作,但是,我可以从控制器中拒绝它吗?我正在考虑使用表达但我无法做到正确。这是我的代码

array('deny',
        'actions'=>array('view'),
        'expression'=>'$user->getName()!=??',
),

取代'??'的正确表达是什么?部分? 我试图使用$ id(actionView参数),但它向我显示错误..

3 个答案:

答案 0 :(得分:1)

我通常在控制器级别执行此操作,我执行以下操作:

public function actionView($id){
 if($id != Yii::app()->user->id) {
    throw new CHttpException('403','You are not allowed to see this page');
 }

 //Continue with the code
}

假设您已将记录的用户ID存储在Yii:app()->user变量中。

这也可行:

array('deny',
    'actions'=>array('view'),
    'expression'=>'$_GET["id"] != Yii::app()->user->id',
),

答案 1 :(得分:1)

最佳做法是创建自定义过滤器(在application.components.controller中,如果您多次使用它):

public function filterCheckOwner($filterChain)
{
    if ($id=Yii::app()->getRequest()->getParam('id'))
    {        
        if($id != Yii::app()->user->id)
            throw new CHttpException('403','You are not allowed to see this page');
        else
            $filterChain->run();
    }
}

然后只需添加必须在具有相同名称的filters()方法中运行它的操作(不使用“过滤器”):

public function filters()
{
    return array(
        ...
        'checkOwner + view, update, whatever', 
        ...
    );
}

答案 2 :(得分:0)

使用选项allow可以更轻松地获得所需内容。

         'actions' => ['view', 'list-post', 'unsubscribe'],
         'allow' => $_GET['id'] == Yii::$app->user->id,