這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)怎么在YII2框架中使用RBAC控制模塊,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
鄱陽網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)建站2013年開創(chuàng)至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。在使用YII2中自帶的RBAC時(shí),需要先配置config/web.php:
return [ // ... 'components' => [ 'authManager' => [ 'class' => 'yii\rbac\DbManager', ], // ... ], ];
如果你需要運(yùn)行yii migrate來創(chuàng)建表,那么config/console.php也需要同上面一樣配置一下。
cmd進(jìn)入項(xiàng)目目錄,運(yùn)行如下命令:
yii migrate --migrationPath=@yii/rbac/migrations
你會(huì)發(fā)現(xiàn)在數(shù)據(jù)庫中創(chuàng)建了四張表
auth_assignment 角色與用戶的關(guān)聯(lián)表 auth_item 存放角色與權(quán)限,通過type字段區(qū)分 auth_item_child 存放角色與權(quán)限的上下級(jí)關(guān)系 auth_rule 規(guī)則表,用于擴(kuò)展權(quán)限功能
為了演示,我們?cè)诳刂破飨路謩e寫四個(gè)方法,分別用來創(chuàng)建權(quán)限,創(chuàng)建角色,指派角色,使用規(guī)則。
IndexController.php代碼如下:
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'); } } //為了演示,這里我們添加幾條權(quán)限 public function actionPer() { $auth = YII::$app->authManager; //創(chuàng)建用戶刪除權(quán)限 $per = $auth->createPermission('user/del'); $per->description = '刪除用戶'; $auth->add($per); //創(chuàng)建用戶更新權(quán)限 $per = $auth->createPermission('user/upd'); $per->description = '更新用戶'; $auth->add($per); //創(chuàng)建用戶添加權(quán)限 $per = $auth->createPermission('user/add'); $per->description = '添加用戶'; $auth->add($per); //創(chuàng)建用戶查看權(quán)限 $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); //給管理員賦予權(quán)限 $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); } //添加規(guī)則 public function actionRule() { $auth = YII::$app->authManager; $rule = new UserUpdSelfRule(); $auth->add($rule); //創(chuàng)建權(quán)限,與規(guī)則關(guān)聯(lián) $per = $auth->createPermission('user/upd/updSelf'); $per->description = '用戶只能修改自已'; $per->ruleName = $rule->name; $auth->add($per); //這里,要注意,要把user/upd/updSelf權(quán)限設(shè)為user/upd的父級(jí) //要不然,普通員工訪問user/upd這個(gè)方法會(huì)被攔住 $auth->addChild($per, $auth->getPermission('user/upd')); //給普通員工賦予user/upd/updSelf權(quán)限,注意我們這里并沒有給員工賦予user/upd權(quán)限 $auth->addChild($auth->getRole('employee'), $per); } }
我們?cè)陧?xiàng)目目錄下創(chuàng)建rbac目錄,并創(chuàng)建UserUpdSelfRule.php,來實(shí)現(xiàn)用戶只能修改自已信息的規(guī)則。
我們?cè)L問index/per查看數(shù)據(jù)表中的變化。
訪問index/role結(jié)果如下:
訪問index/assign結(jié)果如下:
訪問index/rule結(jié)果如下:
為了能夠?qū)ξ覀兊哪K,控制器,方法進(jìn)行權(quán)限控制,我們需要?jiǎng)?chuàng)建一個(gè)基類來統(tǒng)一處理,上面的控制器就是繼承自基類。
BaseController.php代碼如下:
module->id) ? $this->module->id : ''; $cid = !empty($this->id) ? $this->id : ''; $aid = !empty($action->id) ? $action->id : ''; //如果模塊為basic,我們只驗(yàn)證控制器/方法 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('你沒有權(quán)限'); } } return parent::beforeAction($action); } //檢查是否在線 public function checkOnline() { return !empty(YII::$app->user->id) ? true : false; } }為了演示,我們創(chuàng)建一個(gè)UserController.php,代碼如下:
request->get('id', 0); echo 'user id : ', YII::$app->user->id, '
'; //先判斷用戶有沒有只能修改自已的權(quán)限 if (YII::$app->user->can('user/upd/updSelf')) { //然后再判斷修改ID是否與自已的ID一樣,在UserUpdSelfRule里進(jìn)行判斷 if (YII::$app->user->can('user/upd/updSelf', ['id' => $id])) { echo '有權(quán)修改自已'; } else { echo '不能修改除自已以外的'; } } else { echo '修改所有'; } } public function actionDel() { echo 'user id : ', YII::$app->user->id, '
'; echo 'user del'; } public function actionList() { echo 'user id : ', YII::$app->user->id, '
'; echo 'user list'; } public function actionAdd() { echo 'user id : ', YII::$app->user->id, '
'; echo 'user add'; } }我的用戶表里有兩個(gè)用戶
分別登陸這兩個(gè)用戶,然后讓他們?cè)L問user/add,user/del,user/list,user/upd,結(jié)果如下:
admin用戶狀態(tài)如下:
test用戶狀態(tài)如下:
test之所以能夠訪問user/upd是因?yàn)槲覀儼製ser/upd/updSelf設(shè)為了user/upd的父級(jí),如果沒有設(shè)置,這里是會(huì)被攔住的。
上述就是小編為大家分享的怎么在YII2框架中使用RBAC控制模塊了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
新聞名稱:怎么在YII2框架中使用RBAC控制模塊-創(chuàng)新互聯(lián)
URL分享:http://weahome.cn/article/desspi.html