Yii2:将访问控制过滤器设置为禁止后重定向

时间:2015-07-11 07:05:50

标签: authentication yii2

我有一个在行为函数中使用AccessControl的控制器:

public function behaviors()
    {       
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'actions' => ['login', 'error'],
                        'allow' => true,
                    ],
                    [
                        'actions' => ['logout', 'index'],
                        'allow' => true,
                        'roles' => ['@'],
                        'matchCallback' => function(){
                            return (Yii::$app->user->identity->ROLE_ID=='1');
                        }
                    ],
                ],
            ],
        ];
    }

在我的应用程序中有2个角色, admin 用户,role_id 1是admin,role_id 2是staff,两者都可以访问/app/administrator所以我过滤接着就,随即。当我与员工登录时,它会显示禁止的页面。

当我登录的用户不是管理员时,我想在登录页面中重定向。也许我必须在AccessControl选项中添加脚本。那么,我该怎么办?感谢

1 个答案:

答案 0 :(得分:1)

您需要指定denyCallback才能实现此目标。

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
               //your access rules
            ],
            'denyCallback' => function($rule, $action) {
                 //redirection here
            }
        ],
    ];
}

请注意,每次访问被拒绝时都会调用此denyCallback。如果您需要特定于规则的denyCallback,例如你想要不同的应用程序行为,那么你需要像这样指定它:

'rules' => [
    //other rules
    [
        'actions' => ['index'],
        'allow' => false,
        'roles' => ['@'],
        'matchCallback' => function(){
            return (Yii::$app->user->identity->ROLE_ID == 2);
        },
        'denyCallback' => function(){
            //redirect here
        }
    ],
],

此处,我们明确禁止对ROLE_ID == 2用户进行 index 操作并重定向。