我对我的应用有疑问。如何阻止用户查看其他用户个人资料? 我的意思是,用户只能查看自己的个人资料。如果用户123已登录,则允许他在'view& id = 123'中但在'view& id = 234'等中被拒绝。
我知道如何从视图页面执行此操作,但是,我可以从控制器中拒绝它吗?我正在考虑使用表达但我无法做到正确。这是我的代码
array('deny',
'actions'=>array('view'),
'expression'=>'$user->getName()!=??',
),
取代'??'的正确表达是什么?部分? 我试图使用$ id(actionView参数),但它向我显示错误..
答案 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,