摘要:在中,權限與角色相關聯,用戶通過成為適當角色的成員而得到這些角色的權限。這就極大地簡化了權限的管理。角色可依新的需求和系統的合并而賦予新的權限,而權限也可根據需要而從某角色中回收。角色與角色的關系可以建立起來以囊括更廣泛的客觀情況。
之前有個朋友問我yii的rbac怎么做,以前大學的時候有接觸過,很長時間沒用了,也忘記了,正好這幾天比較閑,重新捋了下大體思路,希望可以幫到困在yii的rbac上的門外han~~
RBAC~~什么是RBACRBAC~~權限認證流程基于角色的權限訪問控制(Role-Based Access
Control)作為傳統訪問控制(自主訪問,強制訪問)的有前景的代替受到廣泛的關注。在RBAC中,權限與角色相關聯,用戶通過成為適當角色的成員而得到這些角色的權限。這就極大地簡化了權限的管理。在一個組織中,角色是為了完成各種工作而創造,用戶則依據它的責任和資格來被指派相應的角色,用戶可以很容易地從一個角色被指派到另一個角色。角色可依新的需求和系統的合并而賦予新的權限,而權限也可根據需要而從某角色中回收。角色與角色的關系可以建立起來以囊括更廣泛的客觀情況。
用戶登錄后認證用戶的角色
根據角色 查詢出該角色擁有的權限操作列表
訪問某一個權限(操作)時判斷該用戶是否擁有訪問的能力
yii如何實現呢??這里我們采用數據庫的方式實現,會相對來說比較安全
RBAC~~權限數據生成首先在web/console.php中配置組件
"authManager" => [ "class" => "yii bacDbManager", // auth_item (role permission) // auth_item_child (role->permission) // auth_assignment (user->role) // auth_rule (rule) "itemTable" => "{{%auth_item}}", "itemChildTable" => "{{%auth_item_child}}", "assignmentTable" => "{{%auth_assignment}}", "ruleTable" => "{{%auth_rule}}", ],
接著使用yii腳本,生成數據表
./yii migrate --migrationPath=@yii/rbac/migrations/
然后我們需要讀取所有的控制器與方法 存儲到權限表,方便判斷的時候 讀取數據庫 進而進行判斷
public function actionInit() { $trans = Yii::$app->db->beginTransaction(); try { //構建控制器目錄 $dir = dirname(dirname(__FILE__)). "/modules/controllers"; //找到控制器目錄下的所有文件 $controllers = glob($dir. "/*"); $permissions = []; foreach ($controllers as $controller) { $content = file_get_contents($controller); //找到Controller即可 preg_match("/class ([a-zA-Z]+)Controller/", $content, $match); $cName = $match[1]; $permissions[] = strtolower($cName. "/*"); //正則匹配文本中的所以action preg_match_all("/public function action([a-zA-Z_]+)/", $content, $matches); foreach ($matches[1] as $aName) { $permissions[] = strtolower($cName. "/". $aName); } } $auth = Yii::$app->authManager; //為什么$auth可以操作到該表 foreach ($permissions as $permission) { //是否存在該權限 if (!$auth->getPermission($permission)) { $obj = $auth->createPermission($permission); $obj->description = $permission; $auth->add($obj); } } $trans->commit(); echo "import success "; } catch(Exception $e) { $trans->rollback(); echo "import failed "; } }
接著yii下 就可以生成權限數據了
./yii rbac/init
然后,看看數據庫
RBAC~~權限訪問控制過濾器的使用原理:
權限的控制實則就是判斷當前的用戶是否擁有對方法,控制器訪問的權限 在這之前需要使用過濾器 對用戶的登錄與未登錄進行認證過濾 ,所有的控制器 extends CommonController,在訪問子類控制器的時候,會自動去訪問behaviors方法,在子控制器中,通過重寫父類的屬性指定允許訪問的方法,進而實現過濾的作用。
//子類可以通過重寫該屬性 實現認證 public $mustlogin = ["createrule", "createrole", "roles", "assignitem"]; //行為過濾器 public function behaviors() { return [ "access" => [ "class" => yiifiltersAccessControl::className(), "user" => "admin", "only" => $this->actions, "except" => $this->except, "rules" => [ [ "allow" => false, "actions" => empty($this->mustlogin) ? [] : $this->mustlogin, "roles" => ["?"], ], [ "allow" => true, "actions" => empty($this->mustlogin) ? [] : $this->mustlogin, "roles" => ["@"], ], ], ], ]; } //那么如何實現訪問 判斷用戶是否擁有權限呢??yii提供了beforeAction,在CommonController進行判斷 /*權限訪問判斷*/ public function beforeAction($action) { //調用父類方法 防止被重寫掉 if (!parent::beforeAction($action)) { return false; } //獲取到當前的控制器 $controller = $action->controller->id; $actionName = $action->id; if (Yii::$app->admin->can($controller. "/*")) { return true; } if (Yii::$app->admin->can($controller. "/". $actionName)) { return true; } throw new yiiwebUnauthorizedHttpException("對不起,您沒有訪問". $controller. "/". $actionName. "的權限"); // return true; } //這樣即可實現權限的訪問控制
到這里,我們就是實現了權限的訪問判斷,接下來 我們還要實現 不同用戶顯示不同的菜單,如何實現呢??
原理:
將菜單欄以數組的形式進行存儲,通過循環數組,判斷當前用戶訪問的控制器是否擁有對應的權限
controller->id; $action = Yii::$app->controller->action->id; //循環菜單 foreach (Yii::$app->params["adminmenu"] as $menu) { $show = "hidden"; if (Yii::$app->admin->can($menu["module"]. "/*")) { $show = "show"; } else { if (empty($menu["submenu"]) && !Yii::$app->admin->can($menu["url"])) { continue; } else { foreach ($menu["submenu"] as $sub) { //判斷當前的用戶是否擁有訪問該控制器的權限 if (Yii::$app->admin->can($menu["module"]. "/". $sub["url"])) { $show = "show"; } } } } ?>
這樣就實現了不同登錄用戶 不同菜單的展示
RBAC~~創建不同角色原理:
不同角色擁有不同權限,超級管理員可以創建用戶,及分配權限給不同用戶,首先我們得有個用戶->
/*角色添加*/ public function actionCreaterole() { if (Yii::$app->request->isPost) { //DBmanager對象 $auth = Yii::$app->authManager; //創建一個role的對象 $role = $auth->createRole(null); $post = Yii::$app->request->post(); if (empty($post["name"]) || empty($post["description"])) { throw new Exception("參數錯誤"); } $role->name = $post["name"]; $role->description = $post["description"]; $role->ruleName = empty($post["rule_name"]) ? null : $post["rule_name"]; $role->data = empty($post["data"]) ? null : $post["data"]; if ($auth->add($role)) { Yii::$app->session->setFlash("info", "添加成功"); } } return $this->render("_createitem"); }
原理:
所謂的分配權限就是將給用戶分配是否可以訪問控制器的權限,確認要分配的對象 實則是指定表的user_id對應的item_name值
具體如何做呢?? 看這里->
/* 分配權限 */ public function actionAssignitem($name) { //獲取到角色 $name = htmlspecialchars($name); $auth = Yii::$app->authManager; //獲取到當前角色的信息 $parent = $auth->getRole($name); if (Yii::$app->request->isPost) { $post = Yii::$app->request->post(); if (Rbac::addChild($post["children"], $name)) { Yii::$app->session->setFlash("info", "分配成功"); } } $children = Rbac::getChildrenByName($name); //獲取當前用戶的 $roles = Rbac::getOptions($auth->getRoles(),$parent); //獲取當前用戶擁有的權限 $permissions = Rbac::getOptions($auth->getPermissions(), $parent); return $this->render("_assignitem", ["parent" => $name, "roles" => $roles, "permissions" => $permissions, "children" => $children]); }RBAC~~規則指定,更高級的權限指定
接下來,不得不談談rbac的規則,這又是個什么東西呢?? 所謂的規則 其實就是對用戶的權限的額外限制
原理:
通過定義規則類,添加用戶的時候指定規則名稱 就可以實現對用戶的權限的額外限制,
數據表中,data字段就是實例化的自定義規則類對象
比如我們定義這樣一個自定義規則類
/*實現分類只能由添加者刪除*/ class AuthorRule extends Rule { public $name = "isAuthor"; //當前的用戶,權限,額外的參數 public function execute($user, $item, $params) { $action = Yii::$app->controller->action->id; //對delete方法 進行額外限制 if ($action == "delete") { //獲取到當前分類是由那個用戶添加的 不允許其他用戶刪除 $cateid = Yii::$app->request->get("id"); $cate = Category::findOne($cateid); return $cate->adminid == $user; } return true; } }
我們如何創建這個規則到數據表中呢??
/*創建規則*/ public function actionCreaterule() { if (Yii::$app->request->isPost) { $post = Yii::$app->request->post(); if (empty($post["class_name"])) { throw new Exception("參數錯誤"); } //指定當前的規則命名空間 $className = "appmodels". $post["class_name"]; if (!class_exists($className)) { throw new Exception("規則類不存在"); } $rule = new $className; //使用authManager組件將當前的規則類 保存到數據庫 if (Yii::$app->authManager->add($rule)) { Yii::$app->session->setFlash("info", "添加成功"); } } return $this->render("_createrule"); }
這樣再添加用戶的時候,就可以指定規則,進而實現對更加高級的指定權限
到這里,基本完成了用戶創建,權限分配,及規則指定,希望可以幫到大家~~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/23117.html
摘要:根據修改,只是方式,這個相當于的版本。適合用于前后端分離項目,方式提供接口,實現對接口的權限控制。 根據yii2-admin(https://github.com/mdmsoft/yi...)修改,yii2-admin只是web方式,這個相當于yii2-admin的rest版本。適合用于前后端分離項目,rest方式提供接口,實現對接口的權限控制。項目地址:https://github....
摘要:一基本概念角色是權限的集合例如建貼改貼。特定情況下,一個角色可能由其他角色或權限構成,而權限又由其他的權限構成。提供了兩套授權管理器和。前者使用腳本存放授權數據,而后者使用數據庫存放授權數據。該表存放授權條目的層次關系。 一:基本概念 角色是 權限 的集合 (例如:建貼、改貼)。一個角色 可以指派給一個或者多個用戶。要檢查某用戶是否有一個特定的權限, 系統會檢查該包含該權限的角色是否指...
摘要:利用渲染后臺模板后臺的模板我們采用利用插播一曲是一個完全響應管理模板。基于框架,易定制模板。適合多種屏幕分辨率,從小型移動設備到大型臺式機。內置了多個頁面,包括儀表盤郵箱日歷鎖屏登錄及注冊錯誤錯誤等頁面。 作者:白狼 出處:http://www.manks.top/yii2_fra... 本文版權歸作者,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保...
摘要:一的前期準備的權限管理需要知道怎么給用戶分配角色,給角色分配權限,以權限來精細化需要的操作,判斷是否有權限來操作這一步,達到管理權限的目的。若沒有則渲染不顯示數據提交更新相應的修改或者增加。 一、RBAC的前期準備 RBAC的權限管理需要知道怎么給用戶分配角色,給角色分配權限,以權限來精細化需要的操作,判斷是否有權限來操作這一步,達到管理權限的目的。 先展示下要達到的效果 : show...
摘要:是一個用語言打造的輕量級開源訪問控制框架,目前在開源。采用了元模型的設計思想,支持多種經典的訪問控制方案,如基于角色的訪問控制基于屬性的訪問控制等。 PHP-Casbin 是一個用 PHP 語言打造的輕量級開源訪問控制框架( https://github.com/php-casbin... ),目前在 GitHub 開源。PHP-Casbin 采用了元模型的設計思想,支持多種經典的訪問...
閱讀 1800·2021-11-22 09:34
閱讀 3083·2019-08-30 15:55
閱讀 663·2019-08-30 15:53
閱讀 2054·2019-08-30 15:52
閱讀 3000·2019-08-29 18:32
閱讀 1989·2019-08-29 17:15
閱讀 2392·2019-08-29 13:14
閱讀 3557·2019-08-28 18:05