首页 > 解决方案 > Yii2 RBAC 不工作 - 允许访问所有内容

问题描述

我遇到了一个问题,我在 Yii 2.0 中配置了 RBAC,但它不起作用——这意味着它不会阻止任何页面被加载——即使作为访客也是如此。

这是在我的 web.php 配置中(也在我的 console.php 中):

'authManager' => [
    'class' => 'yii\rbac\DbManager',
],

迁移已成功完成。

这是目前behaviors()的样子,但我尝试了很多不同的方法。

    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'actions' => ['error'],
                        'allow' => true,
                        //'roles' => ["?"],
                    ],
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'logout' => ['post'],
                ],
            ],
        ];
    }

如果我behaviors()在我的控制器中实现该功能,框架开始进行一些访问处理,但据我所知,使用数据库的目标应该是 RBAC 系统接管这个责任——这意味着我不必启用/禁用每个我为每个角色编写的单个动作。

我添加了一个角色“管理员”并为其分配了一些可用的路由(操作)。然后我将此角色分配给我的用户名。从理论上讲,这应该使我的登录名可以访问那些特定的路线,但不能访问其他任何东西-相反,我可以随心所欲地遍历该站点,而无需任何 403。(这就是为什么我说 RBAC 的行为就像它不存在一样。)

任何提示或提示表示赞赏。

谢谢。

标签: phpyii2rbac

解决方案


您的 authManager 配置在哪里?

根据[yii2指南]

如果您使用的是 yii2-basic-app 模板,则有一个 config/console.php 配置文件,其中需要在 config/web.php 中另外声明 authManager。在 yii2-advanced-app 的情况下,authManager 应该只在 common/config/main.php 中声明一次。

更新到这个问题,我只是尝试手动执行 rbac

我的结果我们必须在每一个动作中做有条件的,比如

...
    public function actionAbout()
    {
        if (Yii::$app->user->can('ViewAbout')) {
            echo "you may see view about";
        } else {
            echo "view about is prohibited";
        }
        // return $this->render('about');
    }
...

如果你想以通用方式分配它,你最好使用处理 authmanager 的扩展/模块(如 yii2-admin、yii2-mimin 等)

希望这个答案有帮助


推荐阅读