YII2如何在accesscontrol中允许调试/默认/工具栏

时间:2017-01-11 02:11:11

标签: yii2 yii2-basic-app

我在web.php文件中有以下配置,强制用户在使用该应用程序之前先登录。

'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' => ['@'],
            ],

        ],
    ],

但我在Forbidden (#403)

中收到http://localhost/yii2/debug/default/toolbar?tag=58759099581f2错误

如何在规则中允许?

2 个答案:

答案 0 :(得分:1)

首先,此配置不正确。这部分:

[
    'actions' => ['logout', 'index'], // add all actions to take guest to login page
    'allow' => true,
    'roles' => ['@'],
],

还将仅对经过身份验证的用户执行logoutindex次操作。需要将其更改为:

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

允许访问整个网站。然后,您可以在AccessControl或特定控制器的操作中进一步自定义访问权限。因此,在您的情况下,调试不是唯一的禁止页面。

我认为这是从this answer复制粘贴到SO上的相关问题。

顺便说一下,在基本应用程序的应用程序配置中已经启用了调试:

if (YII_ENV_DEV) {
    // configuration adjustments for 'dev' environment
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = [
        'class' => 'yii\debug\Module',
        // uncomment the following to add your IP if you are not connecting from localhost.
        //'allowedIPs' => ['127.0.0.1', '::1'],
    ];

    // Below Gii is enabled too, code is omitted for brevity
}

因此,当用户通过身份验证时,您可以毫无问题地访问调试模块。

  

注意:对于此配置,每个控制器的loginerror操作都允许未经过身份验证的用户。小心一点。其他控制器中可能存在具有相似名称的操作。

更新:实际上您可以通过$matchCallback进一步提高此解决方案的灵活性:

'as access' => [
    'class' => \yii\filters\AccessControl::className(),
    'rules' => [
        [
            'matchCallback' => function ($rule, $action) {
                $allowedControllers = [
                    'debug/default',
                ];
                $allowedActions = [
                    'site/login',
                    'site/error',
                ];
                $isAllowedController = in_array($action->controller->uniqueId, $allowedControllers);
                $isAllowedAction = in_array($action->uniqueId, $allowedActions);

                return $isAllowedController || $isAllowedAction;
            },
            'allow' => true,
        ],
        [
            'allow' => true,
            'roles' => ['@'],
        ],
    ],
],
  • 将完全允许的控制器放在$allowedControllers列表中(如果模块位于模块内,则在模板名称前面加上)以完全允许它们(允许所有操作)。
  • 将允许的操作放在$allowedActions列表中(前缀为控制器名称,如果属于模块,则为模块名称)。

通过这种方式,您可以在每个页面(包括loginerror)上对本地服务器上的调试模块具有完全访问权限。

此外,这可以防止来自不同模块/控制器的动作名称重合。

答案 1 :(得分:0)

您必须启用工具栏操作web.php配置文件:

  'rules' => [

        [

            'actions' => ['login', 'error', 'toolbar'],

            'allow' => true,

        ],