共计 2877 个字符,预计需要花费 8 分钟才能阅读完成。
一:基本概念
角色是 权限 的集合(例如:建贴、改贴)。一个角色 可以指派给一个或者多个用户。要检查某用户是否有一个特定的权限,系统会检查该包含该权限的角色是否指派给了该用户。
可以用一个规则 rule 与一个角色或者权限关联。一个规则用一段代码代表,规则的执行是在检查一个用户是否满足这个角色或者权限时进行的。例如,” 改帖 ” 的权限 可以使用一个检查该用户是否是帖子的创建者的规则。权限检查中,如果该用户 不是帖子创建者,那么他(她)将被认为不具有 “ 改帖 ” 的权限。
角色和权限都可以按层次组织。特定情况下,一个角色可能由其他角色或权限构成,而权限又由其他的权限构成。Yii 实现了所谓的 局部顺序 的层次结构,包含更多的特定的 树 的层次。一个角色可以包含一个权限,反之则不行。(译者注:可理解为角色在上方,权限在下方,从上到下如果碰到权限那么再往下不能出现角色)
二:配置 RBAC
在开始定义授权数据和执行存取检查之前,需要先配置应用组件 yiibaseApplication::authManager。Yii 提供了两套授权管理器:yiirbacPhpManager 和 yiirbacDbManager。前者使用 PHP 脚本存放授权数据,而后者使用数据库存放授权数据。如果你的应用不要求大量的动态角色和权限管理,你可以考虑使用前者
1:使用 yiirbacPhpManager
return [
// ...
'components' => [
'authManager' => ['class' => 'yii\rbac\PhpManager',],
// ...
],
];
配置完成之后你就可以通过 Yii::$app->authManager 来访问 authManager
yiirbacPhpManager 默认将 RBAC 数据保存在 @app/rbac 目录下的文件中。如果权限层次数据在运行时会被修改,需确保 WEB 服务器进程对该目录和其中的文件有写权限。
2:使用 yiirbacDbManager
(1)配置 yiirbacDbManager
return [
// ...
'components' => [
'authManager' => [
'class' => 'yii\rbac\DbManager',
// uncomment if you want to cache RBAC items hierarchy
// 'cache' => 'cache',
],
// ...
],
];
这里注意:
如果你使用的是 Yii 的基础模板的话,上面的配置你需要在 config/console.php 和 config/web.php 文件中都进行配置,如果你是 Yii 的高级模板的话,只需要在 common/config/main.php 文件中配置一次就可以了
(2)生成所需要的权限表
使用 yiirbacDbManager 的话,需要生成 4 个数据库表存放权限数据(他们都有默认表名,如果你需要修改表名的话,在配置 yiirbacDbManager 时进行修改)
itemTable:该表存放授权条目(译者注:即角色和权限)。默认表名为 "auth_item"。itemChildTable:该表存放授权条目的层次关系。默认表名为 "auth_item_child"。assignmentTable:该表存放授权条目对用户的指派情况。默认表名为 "auth_assignment"。ruleTable:该表存放规则。默认表名为 "auth_rule"。
在项目目录执行
yii migrate --migrationPath=@yii/rbac/migrations
执行上面的命令后,这时候在我们的数据库中就会生成上述所说的四个表了
如果你不细化使用命令生成数据库的话,你可以将 vendoryiisoftyii2rbacmigrationsschema-mysql.sql 的内容拷贝里面到数据库运行生成数据表
生成对应的权限表之后,这时候我们就可以使用 Yii::$app->authManager 来访问 authManager
三:建立授权数据
1: 添加 (创建) 权限(在 auth_item 表中生成权限数据,type 为 2 表示权限)
$auth = Yii::$app->authManager;
// 添加 "createPost" 权限
$createPost = $auth->createPermission('createPost');
$createPost->description = '创建了 createPost 权限';
$auth->add($createPost);
2: 创建角色(在 auth_item 表中生成角色数据,type 为 1 表示角色)
$auth = Yii::$app->authManager;
$role = $auth->createRole('author');
$role->description = '创建了 author 角色';
$auth->add($role);
3:给角色赋予权限
(1)给角色赋予指定权限
$auth = Yii::$app->authManager;
$createPost = $auth->createPermission('createPost');// 创建权限对象
$role = $auth->createRole('author');// 创建角色对象
$auth->addChild($role, $createPost); // 添加对应关系(给 author 角色添加 createPost 权限)
(2)给角色赋予指定角色的所有权限
$auth = Yii::$app->authManager;
$role1 = $auth->createRole('author1');// 创建角色对象
$role2 = $auth->createRole('author2');// 创建权限对象
$auth->addChild($role1, $role2); // 添加对应关系(给 author1 角色添加 author2 角色所有权限)
4: 给用户分配角色
$auth = Yii::$app->authManager;
$role = $auth->createRole('author');// 创建角色对象
$auth->assign($role, 1); #1 是 IdentityInterface::getId()返回的 id, 及用户表的 id
四:验证权限
\Yii::$app->user->can($action) #$action 表示权限
\Yii::$app->user->can('createPost') #判断用户是否具有 createPost 权限
获取用户所属角色
$auth = Yii::$app->authManager;
$roles = $auth->getRolesByUser($userId);
获取用户所属权限
$auth = Yii::$app->authManager;
$roles = $auth->getPermissionsByUser($userId);
上面就是基于角色的存取控制(RBAC)简单了解,详细可参考 Yii 的官方文档:https://www.yiichina.com/doc/…