YII:如何在组件控制器类" CController"下重新定向afterAction。

时间:2016-02-15 14:49:25

标签: redirect yii

我需要你的帮助来解决我的问题。我大约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);

2 个答案:

答案 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将限制操作用于角色。