3

我现在正在尝试在 Yii 框架下开发一个网站,并且程序中需要基于角色的访问控制(RBAC)。我从指南中读到过滤器可用于 RBAC,但我想知道如果管理员和用户存储在两个表中该怎么办?即如果数据库中有两张表,一张给管理员,一张给用户,我应该如何实现访问控制?谢谢你。

4

3 回答 3

3

这是可能的。不管多么棘手,我不能保证这不会在将来带来问题。您需要的是有两个或多个表AuthAssignment,例如AuthAssignment_AdminsAuthAssignment_Customers,并确保CDbAuthManager每次调用它时都引用相关的表(例如,在分配角色或检查权限时)。

我将从远处开始,但你会明白为什么。

  1. 我们必须创建一种机制来告诉登录用户属于哪个表/类别。这可以通过扩展来完成Yii::app()->user在这里解释。您可能想要添加一个特殊的参数(例如authTable)或与分配的模型进行比较。

  2. 你必须延长CDbAuthManager. 在组件中创建一个类CDbAuthManagerTwoTables,并在您的 in 中引用config.phpin authManageras 'class' => 'CDbAuthManagerTwoTables'。在CDbAuthManagerTwoTables

    <?php
    class CDbAuthManagerTwoTables extends CDbAuthManager {
       // public $assignmentTable = 'AuthAssignment'; 
       public $assignmentTable = 'AuthAssignment_Customers'; // you may want to have AuthAssignment_Customers to be your default table
       function __construct() {
          if (!Yii::app()->user->isGuest) {
             if (Yii::app()->user->authTable == 'admin') {
                $this->assignmentTable = 'AuthAssignment_Admins';
             } else {
                $this->assignmentTable = 'AuthAssignment_Customers';
             }
          }
      }
    
      public function setType($assignmentTable = '') { // this method will be needed during authentication
         switch ($assignmentTable) {
           case 'Admin':
             $assignmentTable = 'AuthAssignment_Admins';
             break;
           case 'Customer':
             $assignmentTable = 'AuthAssignment_Customers';
             break;
           default:
             $assignmentTable = 'AuthAssignment_Customers';
             break;
         }
         $this->assignmentTable = $assignmentTable;
      }
    
    }
    
  3. 现在在认证时分配。我们假设您已经有单独的登录表单并在UserIdentity.php. 在你的代码中的某个地方你会做:

     $this->setState('authTable', 'admin'); 
    
     $auth = Yii::app()->authManager;  // You should already have this in your code
     $auth->setType('Admin');   // call to our new method from CDbAuthManagerTwoTables
     if (!$auth->isAssigned($user->role, $this->_id)) {
        if ($auth->assign($user->role, $this->_id)) {
           Yii::app()->authManager->save();
        }
     }
    
  4. 没有第 4 步。

因此,对于Customers任何其他表格和授权也是如此。让我知道如何为您工作。

于 2012-11-13T10:28:37.433 回答
2

我认为这是不可能的。当您检查 authassignment 的 db 架构时,您会看到它有一个 userid 字段,该字段与您的 users 表相关。如果您有两个不同的表,则需要在 auth 表中使用另一个唯一标识符。您是否绝对有必要为您的用户提供两个不同的表?实际上,RBAC 对于分离关注点非常有用。所以你有一个用户表,但是你可以给你的用户分配不同的角色,比如“admin”,“editor”等。如果你有两个不同的用户表,如果一个用户变成了管理员,你会怎么做?这是您不应该处理的复杂性。如果您必须这样做,您将不得不扩展 RBAC 功能,以便可以引用 tp 不同的表。

于 2012-05-12T22:09:52.697 回答
0

更改 UserID 的存储方式

我目前正在处理这个确切的问题,我的解决方案是修改用户 ID 在分配表中的存储方式。我不是只存储一个整数用户 ID,而是存储一个指示用户 ID 和类型的字符串:

auth_assignments.userid["<typeId>.<userId>"] VARCHAR(64) NOT NULL

分配或检查角色时,使用用户的“授权 ID”而不是他们的正常 ID。希望听到有关此方法的反馈。

于 2013-08-15T18:43:15.690 回答