這篇文章給大家分享的是有關Yii授權之基于角色存取控制的案例分析的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。
創(chuàng)新互聯(lián)“設計定江山,服務贏天下“的思想,用細節(jié)和態(tài)度獲得客戶的認可與同行的尊重,服務是創(chuàng)新互聯(lián)企業(yè)文化中重要的核心思想,每一位員工要致力成為客戶心中堅實的服務后盾。一:基本概念
角色是 權限 的集合 (例如:建貼、改貼)。一個角色 可以指派給一個或者多個用戶。要檢查某用戶是否有一個特定的權限, 系統(tǒng)會檢查該包含該權限的角色是否指派給了該用戶。
可以用一個規(guī)則 rule 與一個角色或者權限關聯(lián)。一個規(guī)則用一段代碼代表, 規(guī)則的執(zhí)行是在檢查一個用戶是否滿足這個角色或者權限時進行的。例如,"改帖" 的權限 可以使用一個檢查該用戶是否是帖子的創(chuàng)建者的規(guī)則。權限檢查中,如果該用戶 不是帖子創(chuàng)建者,那么他(她)將被認為不具有 "改帖"的權限。
角色和權限都可以按層次組織。特定情況下,一個角色可能由其他角色或權限構成, 而權限又由其他的權限構成。Yii 實現(xiàn)了所謂的 局部順序 的層次結構,包含更多的特定的 樹 的層次。 一個角色可以包含一個權限,反之則不行。(譯者注:可理解為角色在上方,權限在下方,從上到下如果碰到權限那么再往下不能出現(xiàn)角色)
二:配置 RBAC
在開始定義授權數(shù)據(jù)和執(zhí)行存取檢查之前,需要先配置應用組件 yiibaseApplication::authManager 。 Yii 提供了兩套授權管理器: yiirbacPhpManager 和 yiirbacDbManager。前者使用 PHP 腳本存放授權數(shù)據(jù), 而后者使用數(shù)據(jù)庫存放授權數(shù)據(jù)。 如果你的應用不要求大量的動態(tài)角色和權限管理, 你可以考慮使用前者
1:使用yiirbacPhpManager
return [ // ... 'components' => [ 'authManager' => [ 'class' => 'yii\rbac\PhpManager', ], // ... ], ];
配置完成之后你就可以通過Yii::$app->authManager來訪問 authManager
yiirbacPhpManager 默認將 RBAC 數(shù)據(jù)保存在 @app/rbac 目錄下的文件中。 如果權限層次數(shù)據(jù)在運行時會被修改,需確保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個數(shù)據(jù)庫表存放權限數(shù)據(jù)(他們都有默認表名,如果你需要修改表名的話,在配置yiirbacDbManager時進行修改)
itemTable: 該表存放授權條目(譯者注:即角色和權限)。默認表名為 "auth_item" 。
itemChildTable: 該表存放授權條目的層次關系。默認表名為 "auth_item_child"。
assignmentTable: 該表存放授權條目對用戶的指派情況。默認表名為 "auth_assignment"。
ruleTable: 該表存放規(guī)則。默認表名為 "auth_rule"。
在項目目錄執(zhí)行
yii migrate --migrationPath=@yii/rbac/migrations
執(zhí)行上面的命令后,這時候在我們的數(shù)據(jù)庫中就會生成上述所說的四個表了
如果你不細化使用命令生成數(shù)據(jù)庫的話,你可以將vendoryiisoftyii2rbacmigrationsschema-mysql.sql 的內(nèi)容拷貝里面到數(shù)據(jù)庫運行生成數(shù)據(jù)表
生成對應的權限表之后,這時候我們就可以使用Yii::$app->authManager來訪問 authManager
三:建立授權數(shù)據(jù)
1:添加(創(chuàng)建)權限(在auth_item表中生成權限數(shù)據(jù),type為2表示權限)
$auth = Yii::$app->authManager;// 添加 "createPost" 權限$createPost = $auth->createPermission('createPost'); $createPost->description = '創(chuàng)建了createPost權限'; $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:給角色賦予權限
(1)給角色賦予指定權限
$auth = Yii::$app->authManager; $createPost = $auth->createPermission('createPost');//創(chuàng)建權限對象 $role = $auth->createRole('author');//創(chuàng)建角色對象 $auth->addChild($role, $createPost); //添加對應關系(給author角色添加createPost權限)
(2)給角色賦予指定角色的所有權限
$auth = Yii::$app->authManager; $role1 = $auth->createRole('author1');//創(chuàng)建角色對象 $role2 = $auth->createRole('author2');//創(chuàng)建權限對象 $auth->addChild($role1, $role2); //添加對應關系(給author1角色添加author2角色所有權限)
4:給用戶分配角色
$auth = Yii::$app->authManager; $role = $auth->createRole('author');//創(chuàng)建角色對象$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);
感謝各位的閱讀!關于Yii授權之基于角色存取控制的案例分析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!