php - 多表时如何进行Yii基于角色的访问控制

标签 php yii

我现在尝试在Yii框架下开发一个网站,程序中需要使用Role-Based Access Control(RBAC)。我在指南上看到filter可以用于RBAC,但是我想知道如果管理员和用户存储在两个表中怎么办?即如果数据库中有两张表,一张给管理员,一张给用户,我应该如何实现访问控制?谢谢。

最佳答案

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

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

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

  2. 您必须扩展 CDbAuthManager。创建一个类,例如CDbAuthManagerTwoTables 在组件中,并在 authManager 中的 config.php 中引用为 '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 或任何其他表和授权也是如此。如果对您有用,请告诉我。

关于php - 多表时如何进行Yii基于角色的访问控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10561203/

相关文章:

jquery - 在 jquery 中禁用和启用提交按钮

javascript - 从 json 转换为数组

PHP do-while 循环在执行 sql 代码时以耗尽内存错误结束

php - MySQL搜索与相邻记录的词距离

php - Yii2 View 中的组件函数

php - 来自 Yii 1.1 动态表单的唯一电子邮件值

php - 带有类的 PHP 中发生了什么?

php - 使用javascript更改php包含路径

php - 使用 Yii 自动存储日期时间

database - 如何使用 Yii Web 应用程序从数据库中添加或删除表?