我有一个在行为函数中使用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
选项中添加脚本。那么,我该怎么办?感谢
答案 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 操作并重定向。