到目前为止,我一直在使用Yii 1.1.14开发Web应用程序,但现在是升级的时候了.
我工作的公司已经开发了自己的访问控制系统,直到我看到它真正的样子才真的很好......数据库中8个表的组合(不包括用户表),一堆外键.
它运行良好,但在我看来,维护所有这些表非常耗时,并且在某些时候,当您的应用程序上线时,如果它遇到一定数量的用户,它可能会变得非常慢.特别是因为其中2个表将用户的表主键作为外键.
所以我决定,当我开始在Yii 2上开发时,我将开始使用RBAC,所以我开始在线寻找教程...只找到许多不同版本的相同代码与作者的角色,以及权限创建或更新帖子.
我在Youtube上找到了5个视频的组合,但它们是关于Yii 1 RBAC的.它们很有帮助,因为我设法理解了RBAC的大部分功能,但我仍有一些疑问,我将在下面列举.请记住,对于此访问控制系统,我使用的是DBManager类.
我怀疑
使用的Yii 1的RBAC有3个表:auth_assignment,auth_item和auth_item_child.现在在Yii 2 RBAC中,出现了一个被调用的新表auth_rule,我仍然不明白该特定表在那里做了什么,如何使用它或如何填充它.
我看到可以通过使用控制器的行为方法来限制用户对某些操作的访问,并根据用户的角色分配对某些操作的访问权限,但是当涉及到这一点时,我必须将我的问题拆分为2:
2.1.第一:如果您可以通过在行为方法中设置操作来限制对操作的访问,那么将权限保存到auth_item表中有什么用?
2.2.第二:如果您决定根据权限控制访问权限,那么您究竟是如何做到的,因为我发现自己在每个函数内部编写了以下类型的代码,我认为使用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']);
}
}
Run Code Online (Sandbox Code Playgroud)由于我们现在使用的访问控制系统,当用户登录时,执行一个复杂的查询,最终返回一个将保存为会话变量的数组,并将用于创建一个包含尽可能多的菜单下拉列表作为菜单类别,即用户有权访问的控制器.如何用RBAC完成?
当要在控制器 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;
}
Run Code Online (Sandbox Code Playgroud)
然后在你的控制器中你可以使用这样的东西:
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'ruleConfig' => [
'class' => 'app\components\AccessRule'
],
'rules' => [
[
'actions' => ['index', 'resource-type'],
'allow'=> true,
'roles' => ['admin'],
],
],
],
];
}
Run Code Online (Sandbox Code Playgroud)
其中 admin 被定义为 auth_item,用户位于 auth_item_assignments 中。