yii2基于访问角色的重定向来更改密码页面

时间:2016-09-30 18:27:34

标签: php redirect yii2 rbac

我在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执行此操作,或者有没有办法使用重定向到登录页面重定向到其他页面?

2 个答案:

答案 0 :(得分:0)

与文档一样:

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

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

答案 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')或最终进入重定向循环。