YII2框架中使用RBAC對模組,控制器,方法的許可權控制及規則的使用示例
本文例項講述了YII2框架中使用RBAC對模組,控制器,方法的許可權控制及規則的使用。分享給大家供大家參考,具體如下:
在使用YII2中自帶的RBAC時,需要先配置config/web.php:
return [ // ... 'components' => [ 'authManager' => [ 'class' => 'yii\rbac\DbManager',],// ... ],];
如果你需要執行yii migrate來建立表,那麼config/console.php也需要同上面一樣配置一下。
cmd進入專案目錄,執行如下命令:
yii migrate --migrationPath=@yii/rbac/migrations
你會發現在資料庫中建立了四張表
auth_assignment 角色與使用者的關聯表 auth_item 存放角色與許可權,通過type欄位區分 auth_item_child 存放角色與許可權的上下級關係 auth_rule 規則表,用於擴充套件許可權功能
為了演示,我們在控制器下分別寫四個方法,分別用來建立許可權,建立角色,指派角色,使用規則。
IndexController.php程式碼如下:
<?php namespace app\controllers; use YII; use app\models\MyUserLogin; use app\rbac\UserUpdSelfRule; use app\controllers\BaseController; class IndexController extends BaseController { //首頁 public function actionIndex() { $this->renderPartial('index'); } //登陸 public function actionLogin() { if (YII::$app->request->isPost) { $user = new MyUserLogin(); $user->load(YII::$app->request->post(),''); if ($user->login()) { echo '登陸成功'; } else { echo '登陸失敗'; } } else { return $this->renderPartial('login'); } } //為了演示,這裡我們新增幾條許可權 public function actionPer() { $auth = YII::$app->authManager; //建立使用者刪除許可權 $per = $auth->createPermission('user/del'); $per->description = '刪除使用者'; $auth->add($per); //建立使用者更新許可權 $per = $auth->createPermission('user/upd'); $per->description = '更新使用者'; $auth->add($per); //建立使用者新增許可權 $per = $auth->createPermission('user/add'); $per->description = '新增使用者'; $auth->add($per); //建立使用者檢視許可權 $per = $auth->createPermission('user/list'); $per->description = '檢視使用者列表'; $auth->add($per); } //新增角色 public function actionRole() { $auth = YII::$app->authManager; //新增管理員角色 $admin = $auth->createRole('admin'); $admin->description = '管理員'; $auth->add($admin); //給管理員賦予許可權 $auth->addChild($admin,$auth->getPermission('user/del')); $auth->addChild($admin,$auth->getPermission('user/upd')); $auth->addChild($admin,$auth->getPermission('user/add')); $auth->addChild($admin,$auth->getPermission('user/list')); //新增普通員工角色 $employee = $auth->createRole('employee'); $employee->description = '普通員工'; $auth->add($employee); $auth->addChild($employee,$auth->getPermission('user/list')); $auth->addChild($employee,$auth->getPermission('user/add')); } //給使用者指派角色 public function actionAssign() { $auth = YII::$app->authManager; //注意這裡的2是使用者的ID,即你使用者表user裡的ID //也可通過YII::$app->user->id獲取 $auth->assign($auth->getRole('admin'),1); $auth->assign($auth->getRole('employee'),2); } //新增規則 public function actionRule() { $auth = YII::$app->authManager; $rule = new UserUpdSelfRule(); $auth->add($rule); //建立許可權,與規則關聯 $per = $auth->createPermission('user/upd/updSelf'); $per->description = '使用者只能修改自已'; $per->ruleName = $rule->name; $auth->add($per); //這裡,要注意,要把user/upd/updSelf許可權設為user/upd的父級 //要不然,普通員工訪問user/upd這個方法會被攔住 $auth->addChild($per,$auth->getPermission('user/upd')); //給普通員工賦予user/upd/updSelf許可權,注意我們這裡並沒有給員工賦予user/upd許可權 $auth->addChild($auth->getRole('employee'),$per); } }
我們在專案目錄下建立rbac目錄,並建立UserUpdSelfRule.php,來實現使用者只能修改自已資訊的規則。
<?php //注意名稱空間要跟你的目錄對應 namespace app\rbac; use yii\rbac\Rule; //必須繼承自yii\rbac\Rule class UserUpdSelfRule extends Rule { public $name = 'userUpdSelf'; //必須要實現execute方法 //$user表示使用者ID //$item規則相關的角色或者許可權 //$params傳遞過來的引數 public function execute($user,$item,$params) { //如果沒有設定引數ID,直接返回true if (!isset($params['id'])) { return true; } //判斷id是否是當前使用者ID return ($params['id'] == $user) ? true : false; } }
我們訪問index/per檢視資料表中的變化。
訪問index/role結果如下:
訪問index/assign結果如下:
訪問index/rule結果如下:
為了能夠對我們的模組,控制器,方法進行許可權控制,我們需要建立一個基類來統一處理,上面的控制器就是繼承自基類。
BaseController.php程式碼如下:
<?php namespace app\controllers; use YII; use yii\web\Controller; class BaseController extends Controller { //不需要驗證的 protected $noCheckAccess = [ 'index/index','index/per','index/role','index/assign','index/rule','index/login',]; //不需要登陸的 protected $noLogin = [ 'index/login',]; //驗證許可權 //注意,不要把獲取模組名,控制器名,方法名寫到init()函式裡,那樣是獲取不到的 //這個坑我已經踩了,大家就不用再去踩了 public function beforeAction($action) { $mid = !empty($this->module->id) ? $this->module->id : ''; $cid = !empty($this->id) ? $this->id : ''; $aid = !empty($action->id) ? $action->id : ''; //如果模組為basic,我們只驗證控制器/方法 if ($mid == 'basic') { $per = "{$cid}/{$aid}"; } else { $per = "{$mid}/{$cid}/{$aid}"; } if (!in_array($per,$this->noLogin)) { if (!$this->checkOnline()) { $this->redirect('index/login'); } } if (!in_array($per,$this->noCheckAccess)) { if (!YII::$app->user->can($per)) { die('你沒有許可權'); } } return parent::beforeAction($action); } //檢查是否線上 public function checkOnline() { return !empty(YII::$app->user->id) ? true : false; } }
為了演示,我們建立一個UserController.php,程式碼如下:
<?php namespace app\controllers; use YII; use app\controllers\BaseController; class UserController extends BaseController { public function actionUpd() { $id = YII::$app->request->get('id',0); echo 'user id : ',YII::$app->user->id,'<br>'; //先判斷使用者有沒有隻能修改自已的許可權 if (YII::$app->user->can('user/upd/updSelf')) { //然後再判斷修改ID是否與自已的ID一樣,在UserUpdSelfRule裡進行判斷 if (YII::$app->user->can('user/upd/updSelf',['id' => $id])) { echo '有權修改自已'; } else { echo '不能修改除自已以外的'; } } else { echo '修改所有'; } } public function actionDel() { echo 'user id : ','<br>'; echo 'user del'; } public function actionList() { echo 'user id : ','<br>'; echo 'user list'; } public function actionAdd() { echo 'user id : ','<br>'; echo 'user add'; } }
我的使用者表裡有兩個使用者
分別登陸這兩個使用者,然後讓他們訪問user/add,user/del,user/list,user/upd,結果如下:
admin使用者狀態如下:
test使用者狀態如下:
test之所以能夠訪問user/upd是因為我們把user/upd/updSelf設為了user/upd的父級,如果沒有設定,這裡是會被攔住的。
更多關於Yii相關內容感興趣的讀者可檢視本站專題:《Yii框架入門及常用技巧總結》、《php優秀開發框架總結》、《smarty模板入門基礎教程》、《php面向物件程式設計入門教程》、《php字串(string)用法總結》、《php+mysql資料庫操作入門教程》及《php常見資料庫操作技巧彙總》
希望本文所述對大家基於Yii框架的PHP程式設計有所幫助。