怀疑Yii2 RBAC

时间:2014-11-05 08:20:35

标签: php yii2 rbac

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

我工作的公司已经开发了自己的访问控制系统,直到我看到它真正的样子我才真的很好...数据库中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。 首先:如果您可以通过在behavior方法中设置操作来限制对操作的访问,那么将权限保存到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完成这项工作?

5 个答案:

答案 0 :(得分:2)

我只能回答你的问题的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
                ],
        ]
    ]
}

这并不能解决“查看自己的用户”的不同问题。样式权限,因为这需要检查ActiveRecord模型(好吧,至少它在我的应用程序中)。如果您想实现这一目标,请在Yii论坛中查看我的帖子:

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

答案 1 :(得分:1)

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

 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表中分配给用户。在行为中我们只是如上所述使用它。在上面的代码中,sysadmin可以访问索引,查看和更新​​操作,而员工可以访问索引,创建,更新和查看操作。

答案 2 :(得分:0)

在控制器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中。

答案 3 :(得分:0)

我为yii2创建了一个新的Rbac系统。您可以直接获得某个操作的权限,操作会显示您不是此操作的授权。

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

我在此处上传了我的详细信息,您可以找到很多解决方案here

答案 4 :(得分:0)

这是我在面对通过权限过滤访问权限时可以提出的最佳解决方案,这很麻烦,但如果您尝试在富有成效的环境中创建角色并希望使用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');
}