如何在涉及多个表时执行基于Yii角色的访问控制

时间:2012-05-12 04:57:53

标签: php yii

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

3 个答案:

答案 0 :(得分:3)

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

我会从远处开始,但你会理解为什么。

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

  2. 您必须延长CDbAuthManager。创建一个类,例如组件中的CDbAuthManagerTwoTables,并在config.php authManager中引用'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; } }

    UserIdentity.php
  3. 现在通过身份验证进行分配。我们假设您已经有了单独的登录表单,并在 $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(); } } 中有单独的方法。您可以在代码中的某处执行:

    Customers
  4. 没有第4步。

  5. {{1}}或任何其他表和授权也是如此。让我知道如果适合你。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

更改用户ID的存储方式

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

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

分配或检查角色时,将使用用户的“授权ID”而不是其正常ID。很想听听有关这种方法的反馈。