一:基本概念php
角色是 權限 的集合 (例如:建貼、改貼)。一個角色 能夠指派給一個或者多個用戶。要檢查某用戶是否有一個特定的權限, 系統會檢查該包含該權限的角色是否指派給了該用戶。mysql
能夠用一個規則 rule 與一個角色或者權限關聯。一個規則用一段代碼表明, 規則的執行是在檢查一個用戶是否知足這個角色或者權限時進行的。例如,"改帖" 的權限 可使用一個檢查該用戶是不是帖子的建立者的規則。權限檢查中,若是該用戶 不是帖子建立者,那麼他(她)將被認爲不具備 "改帖"的權限。web
角色和權限均可以按層次組織。特定狀況下,一個角色可能由其餘角色或權限構成, 而權限又由其餘的權限構成。Yii 實現了所謂的 局部順序 的層次結構,包含更多的特定的 樹 的層次。 一個角色能夠包含一個權限,反之則不行。(譯者注:可理解爲角色在上方,權限在下方,從上到下若是碰到權限那麼再往下不能出現角色)sql
二:配置 RBAC數據庫
在開始定義受權數據和執行存取檢查以前,須要先配置應用組件 yiibaseApplication::authManager 。 Yii 提供了兩套受權管理器: yiirbacPhpManager 和 yiirbacDbManager。前者使用 PHP 腳本存放受權數據, 然後者使用數據庫存放受權數據。 若是你的應用不要求大量的動態角色和權限管理, 你能夠考慮使用前者服務器
1:使用yiirbacPhpManageryii2
return [ // ... 'components' => [ 'authManager' => [ 'class' => 'yii\rbac\PhpManager', ], // ... ], ];
配置完成以後你就能夠經過Yii::$app->authManager來訪問 authManagerapp
yiirbacPhpManager 默認將 RBAC 數據保存在 @app/rbac 目錄下的文件中。 若是權限層次數據在運行時會被修改,需確保WEB服務器進程對該目錄和其中的文件有寫權限。yii
2:使用yiirbacDbManageride
(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/...