我在Yii2应用程序中设置了基于角色的简单访问,其工作方式如下:
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'ruleConfig' => [
'class' => AccessRule::className(),
],
'only' => ['logout', 'contact', 'change-password'],
'rules' => [
[
'actions' => ['login'],
'allow' => true,
'roles' => ['?'],
],
[
'actions' => ['logout', 'contact', 'change-password'],
'allow' => true,
'roles' => [
User::ROLE_USER,
User::ROLE_ADMIN
],
],
[
'actions' => ['logout', 'change-password'],
'allow' => true,
'roles' => [
User::ROLE_NEW_USER
],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'],
],
],
];
}
当用户未登录时,尝试访问注销,联系人或更改密码页面将重定向到登录页面。我还要对此进行配置,以便具有角色ROLE_NEW_USER的用户始终重定向到更改密码页面,直到其状态发生更改(更改密码时数据库中的状态已更新)。
是否可以使用denyCallback执行此操作,或者有没有办法使用重定向到登录页面重定向到其他页面?
答案 0 :(得分:0)
答案 1 :(得分:0)
好的,经过一些捣乱,我设法让它与beforeAction()函数一起工作:
public function beforeAction($action)
{
if (Url::current() != Url::toRoute('site/change-password')
&& isset(Yii::$app->user->getIdentity()->role)
&& Yii::$app->user->getIdentity()->role == User::ROLE_NEW_USER) {
return Yii::$app->getResponse()->redirect(Url::toRoute('site/change-password'));
}
if (!parent::beforeAction($action)) {
return false;
}
return true;
}
请确保包含Url :: current()!= Url :: toRoute(' site / change-password')或最终进入重定向循环。