一:基本概念
角色是 權限 的集合 (例如:建置、變更)。一個角色 可以指派給一個或多個使用者。若要檢查某使用者是否有特定的權限, 系統會檢查該包含該權限的角色是否指派了該使用者。
可以用一個規則 rule 與一個角色或權限關聯。一個規則用一段程式碼代表, 規則的執行是在檢查一個使用者是否滿足這個角色或權限時進行的。例如,"改帖" 的權限 可以使用一個檢查該使用者是否為帖子的創建者的規則。在權限檢查中,如果該使用者 不是貼文創作者,那麼他(她)將被認為不具有 "改帖"的權限。
角色和權限都可以依層次組織。特定情況下,一個角色可能由其他角色或權限構成, 而權限又由其他的權限構成。 Yii 實作了所謂的 局部順序 的層次結構,包含更多的特定的 樹 的層次。一個角色可以包含一個權限,反之則不行。 (譯者註:可理解為角色在上方,權限在下方,從上到下如果碰到權限那麼再往下不能出現角色)
二:配置RBAC
##在開始定義授權資料和執行存取檢查之前,需要先設定應用程式元件yiibaseApplication::authManager 。 Yii 提供了兩套授權管理器: yiirbacPhpManager 和 yiirbacDbManager。前者使用 PHP 腳本存放授權數據, 而後者則使用資料庫存放授權數據。如果你的應用程式不要求大量的動態角色和權限管理, 你可以考慮使用前者1:使用yiirbacPhpManagerreturn [ // ... 'components' => [ 'authManager' => [ 'class' => 'yii\rbac\PhpManager', ], // ... ], ];配置完成之後你就可以透過Yii::$app-> ;authManager來存取authManageryiirbacPhpManager 預設將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"。
$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)的詳細內容。更多資訊請關注PHP中文網其他相關文章!