1:基本概念角色是权限的集合(例如:创建帖子,转发)。一个角色可以分配给一个或多个用户。为了检查用户是否具有特定权限,系统会检查包含权限的角色是否分配给用户。规则可以与角色或权限相关联。规则由一段代码表示,规则的执行是在检查用户是否满足角色或权限时进行的。例如,“转发”权限可以使用一个规则来检查用户是否是帖子的创建者。在权限检查中,如果用户不是帖子的创建者,则认为他(她)没有“修改帖子”的权限。角色和权限都可以分层组织。在某些情况下,一个角色可能由其他角色或权限组成,权限也可能由其他权限组成。Yii实现了所谓的部分顺序层次结构,包含更具体的树级别。角色可以包含权限,但反之则不行。(译者注:可以理解为角色在最上面,权限在最下面,从上到下,如果遇到权限,那么角色就不能出现在最下面)二:配置RBAC在开始定义授权数据之前和执行权限检查,需要先配置应用组件yiibaseApplication::authManager。Yii提供了两个授权管理器:yiirbacPhpManager和yiirbacDbManager。前者使用PHP脚本存储授权数据,后者使用数据库存储授权数据。如果你的应用不需要大量的动态角色和权限管理,可以考虑使用前1种:useyiirbacPhpManagerreturn[//...'components'=>['authManager'=>['class'=>'yii\rbac\PhpManager',],//...],];配置完成后,可以通过Yii::$app->authManager访问authManager。iirbacPhpManager默认将RBAC数据保存在@app/rbac目录下的文件中。如果运行时会修改权限级别数据,请确保WEB服务器进程对该目录及其中的文件有写权限。2:使用yiirbacDbManager(1)配置yiirbacDbManagerreturn[//...'components'=>['authManager'=>['class'=>'yii\rbac\DbManager',//如果要缓存取消注释RBAC项目层次结构//'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”。在项目目录下执行yiimigrate--migrationPath=@yii/rbac/migrations。执行以上命令后,此时我们的数据库中就会生成以上四张表。如果没有使用命令详细生成数据库,可以将vendoriisoftyii2rbacmigrationsschema-mysql.sql的内容复制到数据库中,运行生成的数据表生成对应的权限表。这时候我们可以使用Yii::$app->authManager来访问authManager。三:创建授权数据1:添加(create)权限(权限数据在auth_item表中生成,类型为2为权限)$auth=Yii::$app->authManager;//添加“createPost”权限$createPost=$auth->createPermission('createPost');$createPost->description='CreatedcreatePostpermission';$auth->add($createPost);2:创建角色(在auth_item表中生成角色数据,type为1表示角色)$auth=Yii::$app->authManager;$role=$auth->createRole('author');$role->description='createdtheauthorrole';$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,用户表的id4:验证权限\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/...
