2014-11-05 76 views
11

迄今为止,我一直在使用Yii 1.1.14开发web应用程序,但现在是升级的时候了。对Yii2 RBAC的怀疑

我工作的公司开发了自己的访问控制系统,直到我看到它真的是什么样子的时候,我才真正确定...数据库中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。 Second:如果你决定根据权限控制访问,那么你到底该怎么做,因为我发现自己在每个函数中都写了下列类型的代码,我不认为使用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如何做到这一点?

回答

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; 
} 

然后在你的控制器u可以使用这样的事情:

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

其中,管理被定义为auth_item和用户在auth_item_assignments。

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

0

正如我已经创建了一个新的RBAC系统yii2。您可以直接授予某个操作的权限,并且操作将显示您不是此操作的授权者。

通过这个,你会发现你只会提供需要识别的操作。

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

+1

你应该在这里写出答案的相关部分,而不只是链接到一些资源。 – GMchris 2016-02-24 13:43:37

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-项目表中创建的,他们被分配在AUTH-分配表用户。在行为中,我们只是像上面那样使用它。在上面的代码中,系统管理员可以访问索引,查看和更新​​操作,而员工可以访问索引,创建,更新和查看操作。

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'); 
}