【问题标题】:yii2 redirect based on access role to change password pageyii2 基于访问角色重定向修改密码页面
【发布时间】:2016-09-30 18:27:34
【问题描述】:

我在 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来做到这一点,或者有没有办法使用重定向到登录页面来重定向到其他页面?

【问题讨论】:

    标签: php redirect yii2 rbac


    【解决方案1】:

    在文档中:

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

    这允许您创建一个自定义规则来检查用户是否还没有更改密码并重定向到您想要的任何地方

    【讨论】:

      【解决方案2】:

      好的,经过一番折腾,我设法让它与 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') 否则会进入重定向循环。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-18
        • 1970-01-01
        • 2020-05-13
        相关资源
        最近更新 更多