我有一个控制器,使用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和user, role_id 1是admin, role_id 2是staff,两者都可以访问/app/administrator
,所以我用它过滤。当我和员工一起登录时,显示的是禁止页面。
当登录的用户不是admin时,我想重定向回到登录页面。也许我必须在AccessControl
选项中添加脚本。那么,我能做什么呢?由于
您需要指定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
}
],
],
在这里,我们明确禁止访问index action的用户使用ROLE_ID == 2
和重定向他们。