摘要:一基本概念角色是權(quán)限的集合例如建貼改貼。特定情況下,一個(gè)角色可能由其他角色或權(quán)限構(gòu)成,而權(quán)限又由其他的權(quán)限構(gòu)成。提供了兩套授權(quán)管理器和。前者使用腳本存放授權(quán)數(shù)據(jù),而后者使用數(shù)據(jù)庫(kù)存放授權(quán)數(shù)據(jù)。該表存放授權(quán)條目的層次關(guān)系。
一:基本概念
角色是 權(quán)限 的集合 (例如:建貼、改貼)。一個(gè)角色 可以指派給一個(gè)或者多個(gè)用戶(hù)。要檢查某用戶(hù)是否有一個(gè)特定的權(quán)限, 系統(tǒng)會(huì)檢查該包含該權(quán)限的角色是否指派給了該用戶(hù)。
可以用一個(gè)規(guī)則 rule 與一個(gè)角色或者權(quán)限關(guān)聯(lián)。一個(gè)規(guī)則用一段代碼代表, 規(guī)則的執(zhí)行是在檢查一個(gè)用戶(hù)是否滿(mǎn)足這個(gè)角色或者權(quán)限時(shí)進(jìn)行的。例如,"改帖" 的權(quán)限 可以使用一個(gè)檢查該用戶(hù)是否是帖子的創(chuàng)建者的規(guī)則。權(quán)限檢查中,如果該用戶(hù) 不是帖子創(chuàng)建者,那么他(她)將被認(rèn)為不具有 "改帖"的權(quán)限。
角色和權(quán)限都可以按層次組織。特定情況下,一個(gè)角色可能由其他角色或權(quán)限構(gòu)成, 而權(quán)限又由其他的權(quán)限構(gòu)成。Yii 實(shí)現(xiàn)了所謂的 局部順序 的層次結(jié)構(gòu),包含更多的特定的 樹(shù) 的層次。 一個(gè)角色可以包含一個(gè)權(quán)限,反之則不行。(譯者注:可理解為角色在上方,權(quán)限在下方,從上到下如果碰到權(quán)限那么再往下不能出現(xiàn)角色)
二:配置 RBAC
在開(kāi)始定義授權(quán)數(shù)據(jù)和執(zhí)行存取檢查之前,需要先配置應(yīng)用組件 yiibaseApplication::authManager 。 Yii 提供了兩套授權(quán)管理器: yiirbacPhpManager 和 yiirbacDbManager。前者使用 PHP 腳本存放授權(quán)數(shù)據(jù), 而后者使用數(shù)據(jù)庫(kù)存放授權(quán)數(shù)據(jù)。 如果你的應(yīng)用不要求大量的動(dòng)態(tài)角色和權(quán)限管理, 你可以考慮使用前者
1:使用yiirbacPhpManager
return [ // ... "components" => [ "authManager" => [ "class" => "yii bacPhpManager", ], // ... ], ];
配置完成之后你就可以通過(guò)Yii::$app->authManager來(lái)訪問(wèn) authManager
yiirbacPhpManager 默認(rèn)將 RBAC 數(shù)據(jù)保存在 @app/rbac 目錄下的文件中。 如果權(quán)限層次數(shù)據(jù)在運(yùn)行時(shí)會(huì)被修改,需確保WEB服務(wù)器進(jìn)程對(duì)該目錄和其中的文件有寫(xiě)權(quán)限。
2:使用yiirbacDbManager
(1)配置yiirbacDbManager
return [ // ... "components" => [ "authManager" => [ "class" => "yii bacDbManager", // uncomment if you want to cache RBAC items hierarchy // "cache" => "cache", ], // ... ], ];
這里注意:
如果你使用的是Yii的基礎(chǔ)模板的話(huà),上面的配置你需要在config/console.php和config/web.php文件中都進(jìn)行配置,如果你是Yii的高級(jí)模板的話(huà),只需要在common/config/main.php文件中配置一次就可以了
(2)生成所需要的權(quán)限表
使用yiirbacDbManager的話(huà),需要生成4個(gè)數(shù)據(jù)庫(kù)表存放權(quán)限數(shù)據(jù)(他們都有默認(rèn)表名,如果你需要修改表名的話(huà),在配置yiirbacDbManager時(shí)進(jìn)行修改)
itemTable: 該表存放授權(quán)條目(譯者注:即角色和權(quán)限)。默認(rèn)表名為 "auth_item" 。 itemChildTable: 該表存放授權(quán)條目的層次關(guān)系。默認(rèn)表名為 "auth_item_child"。 assignmentTable: 該表存放授權(quán)條目對(duì)用戶(hù)的指派情況。默認(rèn)表名為 "auth_assignment"。 ruleTable: 該表存放規(guī)則。默認(rèn)表名為 "auth_rule"。
在項(xiàng)目目錄執(zhí)行
yii migrate --migrationPath=@yii/rbac/migrations
執(zhí)行上面的命令后,這時(shí)候在我們的數(shù)據(jù)庫(kù)中就會(huì)生成上述所說(shuō)的四個(gè)表了
如果你不細(xì)化使用命令生成數(shù)據(jù)庫(kù)的話(huà),你可以將vendoryiisoftyii2rbacmigrationsschema-mysql.sql 的內(nèi)容拷貝里面到數(shù)據(jù)庫(kù)運(yùn)行生成數(shù)據(jù)表
生成對(duì)應(yīng)的權(quán)限表之后,這時(shí)候我們就可以使用Yii::$app->authManager來(lái)訪問(wèn) authManager
三:建立授權(quán)數(shù)據(jù)
1:添加(創(chuàng)建)權(quán)限(在auth_item表中生成權(quán)限數(shù)據(jù),type為2表示權(quán)限)
$auth = Yii::$app->authManager; // 添加 "createPost" 權(quán)限 $createPost = $auth->createPermission("createPost"); $createPost->description = "創(chuàng)建了createPost權(quán)限"; $auth->add($createPost);
2:創(chuàng)建角色(在auth_item表中生成角色數(shù)據(jù),type為1表示角色)
$auth = Yii::$app->authManager; $role = $auth->createRole("author"); $role->description = "創(chuàng)建了author角色"; $auth->add($role);
3:給角色賦予權(quán)限
(1)給角色賦予指定權(quán)限
$auth = Yii::$app->authManager; $createPost = $auth->createPermission("createPost");//創(chuàng)建權(quán)限對(duì)象 $role = $auth->createRole("author");//創(chuàng)建角色對(duì)象 $auth->addChild($role, $createPost); //添加對(duì)應(yīng)關(guān)系(給author角色添加createPost權(quán)限)
(2)給角色賦予指定角色的所有權(quán)限
$auth = Yii::$app->authManager; $role1 = $auth->createRole("author1");//創(chuàng)建角色對(duì)象 $role2 = $auth->createRole("author2");//創(chuàng)建權(quán)限對(duì)象 $auth->addChild($role1, $role2); //添加對(duì)應(yīng)關(guān)系(給author1角色添加author2角色所有權(quán)限)
4:給用戶(hù)分配角色
$auth = Yii::$app->authManager; $role = $auth->createRole("author");//創(chuàng)建角色對(duì)象 $auth->assign($role, 1); #1是IdentityInterface::getId()返回的id,及用戶(hù)表的id
四:驗(yàn)證權(quán)限
Yii::$app->user->can($action) #$action表示權(quán)限 Yii::$app->user->can("createPost") #判斷用戶(hù)是否具有createPost權(quán)限
獲取用戶(hù)所屬角色
$auth = Yii::$app->authManager; $roles = $auth->getRolesByUser($userId);
獲取用戶(hù)所屬權(quán)限
$auth = Yii::$app->authManager; $roles = $auth->getPermissionsByUser($userId);
上面就是基于角色的存取控制 (RBAC)簡(jiǎn)單了解,詳細(xì)可參考Yii的官方文檔:https://www.yiichina.com/doc/...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/31833.html
摘要:例如,系統(tǒng)中某個(gè)用戶(hù)辭職了,只需要將系統(tǒng)中該用戶(hù)的角色授權(quán)撤銷(xiāo)即可。 Q0.有哪些概念需要知道? 一些概念的具體定義如下 用戶(hù)(user): 和計(jì)算機(jī)系統(tǒng)交互的人(在許多設(shè)計(jì)方案中,單個(gè)用戶(hù)可能擁有多個(gè)登錄標(biāo)識(shí)(ID),這些標(biāo)識(shí)可能同時(shí)處于活躍狀態(tài),但身份驗(yàn)證機(jī)制可以使多個(gè)標(biāo)識(shí)匹配到某個(gè)具體的人,即用戶(hù)對(duì)于計(jì)算機(jī)系統(tǒng)來(lái)說(shuō)具有唯一性) 主體(subject): 一個(gè)代表用戶(hù)行為的計(jì)算機(jī)...
摘要:是一個(gè)用語(yǔ)言打造的輕量級(jí)開(kāi)源訪問(wèn)控制框架,目前在開(kāi)源。采用了元模型的設(shè)計(jì)思想,支持多種經(jīng)典的訪問(wèn)控制方案,如基于角色的訪問(wèn)控制基于屬性的訪問(wèn)控制等。 showImg(https://segmentfault.com/img/bVbkDJf?w=500&h=220); PHP-Casbin 是一個(gè)用 PHP 語(yǔ)言打造的輕量級(jí)開(kāi)源訪問(wèn)控制框架( https://github.com/php...
摘要:在中,權(quán)限與角色相關(guān)聯(lián),用戶(hù)通過(guò)成為適當(dāng)角色的成員而得到這些角色的權(quán)限。這就極大地簡(jiǎn)化了權(quán)限的管理。角色可依新的需求和系統(tǒng)的合并而賦予新的權(quán)限,而權(quán)限也可根據(jù)需要而從某角色中回收。角色與角色的關(guān)系可以建立起來(lái)以囊括更廣泛的客觀情況。 之前有個(gè)朋友問(wèn)我yii的rbac怎么做,以前大學(xué)的時(shí)候有接觸過(guò),很長(zhǎng)時(shí)間沒(méi)用了,也忘記了,正好這幾天比較閑,重新捋了下大體思路,希望可以幫到困在yii的r...
摘要:原文來(lái)自上一篇文章講了用戶(hù)的注冊(cè),驗(yàn)證和登錄,這一篇文章按照約定來(lái)說(shuō)說(shuō)之中的用戶(hù)和權(quán)限控制。探尋上面的一些列設(shè)置和代碼更改,已經(jīng)實(shí)現(xiàn)了一小部分的用戶(hù)控制登錄的用戶(hù)才能發(fā)表。 原文來(lái)自: https://jellybool.com/post/programming-with-yii2-user-access-controls 上一篇文章講了用戶(hù)的注冊(cè),驗(yàn)證和登錄,這一篇文章按照...
摘要:是一個(gè)用語(yǔ)言打造的輕量級(jí)開(kāi)源訪問(wèn)控制框架,目前在開(kāi)源。采用了元模型的設(shè)計(jì)思想,支持多種經(jīng)典的訪問(wèn)控制方案,如基于角色的訪問(wèn)控制基于屬性的訪問(wèn)控制等。 PHP-Casbin 是一個(gè)用 PHP 語(yǔ)言打造的輕量級(jí)開(kāi)源訪問(wèn)控制框架( https://github.com/php-casbin... ),目前在 GitHub 開(kāi)源。PHP-Casbin 采用了元模型的設(shè)計(jì)思想,支持多種經(jīng)典的訪問(wèn)...
閱讀 803·2023-04-25 20:32
閱讀 2445·2021-11-24 10:27
閱讀 4623·2021-09-29 09:47
閱讀 2332·2021-09-28 09:36
閱讀 3727·2021-09-22 15:27
閱讀 2855·2019-08-30 15:54
閱讀 425·2019-08-30 11:06
閱讀 1328·2019-08-30 10:58