Yii2要求所有Controller和Action登录

时间:2015-05-06 04:57:54

标签: php yii yii2

在我的sitecontroller中,我这样写

    'access' => [
        'class' => AccessControl::className(),
        'rules' => [
            [
                'actions' => ['login', 'error'],
                'allow' => true,
            ],
            [
                'actions' => ['logout', 'index' ,'call-back'], // add all actions to take guest to login page
                'allow' => true,
                'roles' => ['@'],
            ],
        ],
    ],

所以如果我去索引或回拨动作,我会重定向到登录页面。 但我必须为每个控制器的所有动作做这件事。 你能告诉我最好的办法吗?

4 个答案:

答案 0 :(得分:30)

将此规则放在rules部分的开头:

[
    'allow' => true,
    'roles' => ['@'],
],

省略actions表示所有操作。

所以你的AccessControl配置就像这样:

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'allow' => true,
                    'roles' => ['@'],
                ],

                // ...
            ],
        ],
    ];
}

请记住,规则是按照声明的顺序应用的。

要在没有继承的情况下全局执行,请在应用程序配置中的as beforeRequest声明下面添加components数组(不在内部!):

'components' => [ ... ],
'as beforeRequest' => [
    'class' => 'yii\filters\AccessControl',
    'rules' => [
        [
            'allow' => true,
            'actions' => ['login'],
        ],
        [
            'allow' => true,
            'roles' => ['@'],
        ],
    ],
    'denyCallback' => function () {
        return Yii::$app->response->redirect(['site/login']);
    },
],

此代码将在每个请求之前运行,并阻止除login以外的所有操作。

确保除login之外的其他控制器中没有SiteController操作。如果存在(例如它们用于不同目的),则在相应的控制器中明确阻止它们。但这种情况非常罕见。

答案 1 :(得分:6)

如果要为所有控制器操作添加访问控制。请在组件部分下的主配置文件中添加以下代码。

'as access' => [
        'class' => \yii\filters\AccessControl::className(),//AccessControl::className(),
        'rules' => [
            [
                'actions' => ['login', 'error'],
                'allow' => true,
            ],
            [
                'actions' => ['logout', 'index'], // add all actions to take guest to login page
                'allow' => true,
                'roles' => ['@'],
            ],
        ],
    ],

答案 2 :(得分:4)

如果您完全省略了数组中的" actions" -part,它将对控制器的所有操作都有效。

如果您想为每个控制器执行此操作,只需在其间添加一个图层:

class MyAccessController extends \yii\web\Controller
{
    public function behaviors() 
    {
         return [
            'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                   'actions' => ['login', 'error'],
                   'allow' => true,
                ],
                [
                   'allow' => true,
                   'roles' => ['@'],
                ],
             ],
         ];
     }       
 }

然后从该课程中派生您的controller。 或者您可以将其放在trait中,然后在每个控制器中使用use添加它。

答案 3 :(得分:0)

在以下文件中尝试此操作。

frontend/config/main.php


components =>[ your stuff ],
'as beforeRequest' => 
            [
                'class' => 'yii\filters\AccessControl',
                'rules' =>  [
                                [
                                     'actions' => ['login', 'error'],
                                     'allow' => true,
                                ],
                                [
                                    'allow' => true,
                                    'roles' => ['@'],
                                ],
                            ],
            ],