我现在尝试在Yii框架下开发一个网站,程序中需要使用Role-Based Access Control(RBAC)。我在指南上看到filter可以用于RBAC,但是我想知道如果管理员和用户存储在两个表中怎么办?即如果数据库中有两张表,一张给管理员,一张给用户,我应该如何实现访问控制?谢谢。
最佳答案
这是可能的。无论多么棘手,我都不能保证这不会在未来带来问题。
您需要的是有两个或多个表,例如 AuthAssignment
,例如AuthAssignment_Admins
和 AuthAssignment_Customers
,并确保 CDbAuthManager
每次调用时都引用相关的(例如,分配角色或检查权限时) ).
我将从远方开始,但你会明白为什么。
我们必须创建一种机制来告知登录用户属于哪个表/类别。这可以通过扩展
Yii::app()->user
来完成。说明here .您可能想要添加特殊参数(例如authTable
)或与分配的模型进行比较。您必须扩展
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; } }
现在根据身份验证分配。我们假设您已经在
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步
Customers
或任何其他表和授权也是如此。如果对您有用,请告诉我。
关于php - 多表时如何进行Yii基于角色的访问控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10561203/