0

0

Yii授权之基于角色的存取控制 (RBAC)

步履不停

步履不停

发布时间:2019-06-29 17:49:59

|

2915人浏览过

|

来源于php中文网

原创

Yii授权之基于角色的存取控制 (RBAC)

一:基本概念

角色是 权限 的集合 (例如:建贴、改贴)。一个角色 可以指派给一个或者多个用户。要检查某用户是否有一个特定的权限, 系统会检查该包含该权限的角色是否指派给了该用户。

可以用一个规则 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"。

在项目目录执行

Word-As-Image for Semantic Typography
Word-As-Image for Semantic Typography

文字变形艺术字、文字变形象形字

下载

yii migrate --migrationPath=@yii/rbac/migrations

执行上面的命令后,这时候在我们的数据库中就会生成上述所说的四个表了

409535279-5d1723803767d_articlex.png

如果你不细化使用命令生成数据库的话,你可以将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的官方文档

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

1846

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1223

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1117

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

948

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1398

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1229

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1439

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1303

2023.11.13

俄罗斯搜索引擎Yandex最新官方入口网址
俄罗斯搜索引擎Yandex最新官方入口网址

Yandex官方入口网址是https://yandex.com;用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号