2016-09-30 130 views
0

我有简单的基于角色的访问在我Yii2应用程序中设置的是这样工作的: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

如文档:

访问规则支持许多选项。 您也可以扩展yii\filters\AccessRule以创建您自己的自定义访问规则类

这允许您创建用户是否改变has'n密码,检查自定义规则又和重定向无论你想

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; 
} 

确保你包括地址::电流()!=地址:: toRoute(“网站/更改密码”),或者你在一个重定向循环结束了。