簡體   English   中英

yii2基於訪問角色重定向以更改密碼頁面

[英]yii2 redirect based on access role to change password page

我在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做到這一點,或者是否可以使用重定向到登錄頁面來重定向到其他頁面?

如文檔中所示:

訪問規則支持許多選項。 您也可以擴展yii \\ filters \\ AccessRule來創建自己的自定義訪問規則類

這使您可以創建一個自定義規則,以檢查用戶是否尚未更改密碼並重定向到所需的位置

好吧,經過一番摸索之后,我設法使其與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'),否則您將陷入重定向循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM