首頁 >後端開發 >php教程 >Yii授權之基於角色的存取控制 (RBAC)

Yii授權之基於角色的存取控制 (RBAC)

步履不停
步履不停原創
2019-06-29 17:49:592749瀏覽

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"。

在專案目錄執行

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


執行上面的指令後,這時候在我們的資料庫中就會產生上述所說的四個表了

Yii授權之基於角色的存取控制 (RBAC)

如果你不細化使用指令產生資料庫的話,你可以將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)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn