我需要你的帮助来解决我的问题。我大约3-4个小时就被困在这里。
我为每个用户制作了自定义角色和权限。我已经在组件控制器类的函数afterAction下执行了代码。但是,如果用户无权访问点击的操作,则应将其重定向到错误页面。当我使用重定向功能时,它会显示Cannot modify header information - headers already sent
。如果有人能帮助我,我将非常感激。这是我的代码
if (isset(yii::app()->user->id)) {
$controller = yii::app()->controller->id;
$action = yii::app()->controller->action->id;
$noAuthControllerAction = array();
$noAuthControllerAction[] = 'site/index';
$controllerAction = $controller . '/' . $action;
if (!in_array($controllerAction, $noAuthControllerAction)) {
$isAllowed = $this->isAllowed($controller, $action);
if (!$isAllowed) {
$this->redirect(array('site/denied'));
}
}
}
parent::afterAction($action);
答案 0 :(得分:1)
请始终在控制器中使用accessRules()获取更多信息的角色和权限,请参阅Yii Documentation for authentication and authorization
在您的控制器中
基于角色的基本访问控制如下所示:
array('allow', // allow authenticated owner users to perform the following actions.
'actions' => array('sales', 'export', 'invoice', 'payment'),
'users' => array('@'),
'roles' => array('owner'),
),
基于角色的自定义表达式访问控制如下所示:(这是您需要的)
array('deny', // deny authenticated owner users to perform the following actions if store is not yet selected.
'actions' => array('sales', 'export', 'invoice', 'payment'),
'users' => array('@'),
'roles' => array('owner'),
'deniedCallback' => function() {
Yii::app()->controller->redirect(array('/store/location'));
},
'expression' => '!Yii::app()->user->isStoreSelected()',
),
'表达'是您的规则,如果不符合规则,'deniedCallback'会将您重定向到所需的'控制器/操作',在这种情况下'/ store /位置”。
也不要使用
$this->redirect(array('site/denied'))
用于错误处理,而是使用
throw new CHttpException(401,'Access denied.');
这是处理Yii错误的正确方法。如果您想自定义错误页面,请参阅Error Handling
答案 1 :(得分:0)
afterAction在渲染动作后运行。这是导致错误的原因。 使用beforeAction事件。你知道RBAC吗? RBAC可以帮助您。
http://www.yiiframework.com/doc/guide/1.1/en/topics.auth#role-based-access-control
您可以使用accessControl将限制操作用于角色。