【问题标题】:Doubts about Yii2 RBAC对 Yii2 RBAC 的质疑
【发布时间】:2015-01-01 08:48:52
【问题描述】:

到目前为止,我一直在使用 Yii 1.1.14 开发 Web 应用程序,但现在是升级的时候了。

我工作的公司已经开发了自己的访问控制系统,我对它真的很满意,直到我看到它真正的样子......数据库中8个表的组合(不包括用户表),有一堆外键。

  • 1 个控制器表
  • 1 个操作表
  • 1 个菜单类别表
  • 1 个用户类型表
  • 而其他表基本上一次只连接 2 或 3 个表。

它运行良好,但在我看来,维护所有这些表非常耗时,并且在某些时候,当您的应用程序上线时,如果它遇到一定数量的用户,它可能会变得非常慢。特别是因为其中 2 个表将用户表的主键作为外键。

所以我决定,当我开始在 Yii 2 上进行开发时,我要开始使用 RBAC,所以我开始在网上寻找教程...... 只找到许多不同版本的相同代码的作者角色,以及创建或更新帖子的权限。

我在 Youtube 上找到了 5 个视频的组合,但它们是关于 Yii 1 RBAC 的。它们很有帮助,因为我设法理解了 RBAC 的大部分功能,但我仍然有一些疑问,我会 列举如下。请记住,对于这个访问控制系统,我使用的是 DBManager 类。

我的疑惑

  1. Yii 1 的 RBAC 曾经有 3 个表:auth_assignmentauth_itemauth_item_child。现在在 Yii 2 RBAC 中,出现了一个名为 auth_rule 的新表,我仍然不明白该特定表在那里做什么,如何使用它或如何填充它。

  2. 我看到可以通过使用控制器的行为方法来限制用户对某些操作的访问,并根据用户的角色分配对某些操作的访问权限,但是当涉及到这一点时,我必须将我的问题分为 2:

    2.1。 第一:如果你可以通过在behaviour方法中设置来限制对actions的访问,那么将权限保存到auth_item表有什么用呢?

    2.2。 第二:如果您决定根据权限控制访问,那么您究竟是如何做到的,因为我发现自己在每个函数中都编写了以下类型的代码,而且我不认为使用 RBAC应该就是这么乏味。必须有另一种方式。

    public function actionView($id)
    {
        if(Yii::$app->user->can('view-users')){
            return $this->render('view', [
                'model' => $this->findModel($id),
            ]);
        }else{
            #Redirect to a custom made action that will show a view 
            #with a custom error message
            $this->redirect(['//site/notauthorized']);
        }
    }
    
  3. 由于我们现在使用的访问控制系统,当用户登录时,会执行一个复杂的查询,该查询最终将返回一个数组,该数组将保存为会话变量,并将用于创建一个包含与菜单类别一样多的下拉列表的菜单,用户有权访问的控制器属于该菜单。 RBAC 如何做到这一点?

【问题讨论】:

    标签: php yii2 rbac


    【解决方案1】:

    我只能真正回答您问题的 2.2,因为 3 听起来根本不像 RBAC 应该做的事情。但是,您最有可能从规则表中获取所需的信息,前提是您遵循与您的控制器或操作匹配的命名约定。

    继续回答 2.2:

    您可以像这样简单地设置行为:

    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'allow' => true,
                        'actions' => ['view'],
                        'roles' => ['view-users'], //<-- Note, rule instead of role
                    ],
            ]
        ]
    }
    

    这并不能解决“view-own-users”样式权限的不同问题,因为这需要检查 ActiveRecord 模型(嗯,至少在我的应用程序中是这样)。如果您想实现这一点,请在此处查看我在 Yii 论坛中的帖子:

    http://www.yiiframework.com/forum/index.php/topic/60439-yii2-rbac-permissions-in-controller-behaviors/#entry269913

    【讨论】:

      【解决方案2】:

      我以最简单的方法之一使用它,我在控制器的行为中使用它们。

       public function behaviors()
          {
      
              return [
                  'access' => [
                      'class' => \yii\filters\AccessControl::className(),
                      'rules' => [
                          [
                              'allow' => true,
                              'roles' => ['sysadmin'],
                              'actions' => ['index','view','update'],
                          ],
                          [
                              'allow' => true,
                              'roles' => ['staff'],
                              'actions' => ['index','create','update','view'],
                          ],
                      ],
                  ],
              ];
      
          }
      

      这里的角色是在数据库的 auth-item 表中创建的角色,它们已在 auth-assignment 表中分配给用户。在行为中我们只是像上面那样使用它。在上面的代码中,系统管理员可以访问索引、查看和更新​​操作,而员工可以访问索引、创建、更新和查看操作。

      【讨论】:

        【解决方案3】:

        在控制器 AccessControl 下使用 RBAC 时,Yii2 需要一些设置。我通过制作自己的 AccessRule 文件解决了这个问题。

        namespace app\components;
        
        use Yii;
        
        class AccessRule extends \yii\filters\AccessRule
        {
            protected function matchRole($user)
            {
                if (empty($this->roles)) {
                    return true;
                }
                foreach ($this->roles as $role) {
                    if(Yii::$app->authManager->checkAccess($user->identity->code, $role))
                        return true;
                }
                return false;
        }
        

        然后在你的控制器中你可以使用这样的东西:

        public function behaviors()
        {
            return [
                'access' => [
                    'class' => AccessControl::className(),
                    'ruleConfig' => [
                        'class' => 'app\components\AccessRule'
                    ],
                    'rules' => [
                        [
                            'actions' => ['index', 'resource-type'],
                            'allow'=> true,
                            'roles' => ['admin'],
                        ],
                    ],
                ],
            ];
        }
        

        其中 admin 定义为 auth_item,而用户位于 auth_item_assignments 中。

        【讨论】:

          【解决方案4】:

          因为我已经为 yii2 创建了一个新的 Rbac 系统。您可以直接授予某项操作的权限,该操作将显示您无权执行此操作。

          通过这种方式,您会发现您只会为需要识别的操作提供访问权限。

          我在这里上传了我的详细信息,你可以找到很多解决方案here

          【讨论】:

          • 你应该在这里写下答案的相关部分,而不仅仅是链接到某个资源。
          【解决方案5】:

          当需要按权限过滤访问权限时,这是我能想到的最佳解决方案,虽然很麻烦,但如果您尝试在生产环境中创建角色并希望使用 rbac,它会很有用。

          use yii\web\ForbiddenHttpException;
          
          
          if(Yii::$app->user->can('view-users')){
              return $this->render('view', [
                  'model' => $this->findModel($id),
              ]);
          }else{
              throw new ForbiddenHttpException('You dont have access to this site');
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-13
            • 2020-08-01
            • 1970-01-01
            • 2014-02-03
            • 2016-11-28
            • 2023-03-29
            相关资源
            最近更新 更多