一:基本概念
角色是 許可權 的集合 (例如:建貼、改貼)。一個角色 可以指派給一個或者多個使用者。要檢查某使用者是否有一個特定的許可權, 系統會檢查該包含該許可權的角色是否指派給了該使用者。
可以用一個規則 rule 與一個角色或者許可權關聯。一個規則用一段程式碼代表, 規則的執行是在檢查一個使用者是否滿足這個角色或者許可權時進行的。例如,"改帖" 的許可權 可以使用一個檢查該使用者是否是貼文的建立者的規則。許可權檢查中,如果該使用者 不是貼文建立者,那麼他(她)將被認為不具有 "改帖"的許可權。
角色和許可權都可以按層次組織。特定情況下,一個角色可能由其他角色或許可權構成, 而許可權又由其他的許可權構成。Yii 實現了所謂的 區域性順序 的層次結構,包含更多的特定的 樹 的層次。 一個角色可以包含一個許可權,反之則不行。(譯者注:可理解為角色在上方,許可權在下方,從上到下如果碰到許可權那麼再往下不能出現角色)
二:設定 RBAC
在開始定義授權資料和執行存取檢查之前,需要先設定應用元件 yiibaseApplication::authManager 。 Yii 提供了兩套授權管理器: yiirbacPhpManager 和 yiirbacDbManager。前者使用 PHP 指令碼存放授權資料, 而後者使用資料庫存放授權資料。 如果你的應用不要求大量的動態角色和許可權管理, 你可以考慮使用前者
1:使用yiirbacPhpManager
return [ // ... 'components' => [ 'authManager' => [ 'class' => 'yiirbacPhpManager', ], // ... ], ];
設定完成之後你就可以通過Yii::$app->authManager來存取 authManager
yiirbacPhpManager 預設將 RBAC 資料儲存在 @app/rbac 目錄下的檔案中。 如果許可權層次資料在執行時會被修改,需確保WEB伺服器進程對該目錄和其中的檔案有寫許可權。
2:使用yiirbacDbManager
(1)設定yiirbacDbManager
return [ // ... 'components' => [ 'authManager' => [ 'class' => 'yiirbacDbManager', // 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 [email protected]/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的官方文件
以上就是Yii授權之基於角色的存取控制 (RBAC)的詳細內容,更多請關注TW511.COM其它相關文章!