rbac 权限控制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rbac 权限控制相关的知识,希望对你有一定的参考价值。
RBAC 的控制,大致是通过将角色的权限控制,来控制用户的权限.
需要构建的表为 用户表(user) ,角色表(role),节点表(node),三张主表 , 节点表内记录的是所有的权限和方法.
2张关联表,是为了关联3张数据表的,分别未 角色用户表(user_role),角色权限表(role_node),也可将两张表写成字段分别加入到用户表和权限表内;
废话不多说看下,键表语句如下
用户表:
CREATE TABLE `wj_admin` ( `id` int(11) NOT NULL AUTO_INCREMENT, `account` varchar(20) DEFAULT NULL COMMENT ‘账户名‘, `password` varchar(255) DEFAULT NULL COMMENT ‘密码‘, `email` varchar(100) DEFAULT NULL COMMENT ‘邮箱‘, `role_id` int(11) DEFAULT NULL COMMENT‘角色id‘, `create_time` int(11) DEFAULT NULL, `update_time` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
角色表:
CREATE TABLE `wj_role` ( `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL COMMENT ‘角色名‘, `node_id` varchar(255) DEFAULT NULL COMMENT ‘节点id‘, `create_time` int(11) DEFAULT NULL, `update_time` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
权限表:
CREATE TABLE `wj_node` ( `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL COMMENT ‘节点名‘, `c_name` varchar(255) NOT NULL COMMENT ‘控制器名‘, `f_name` varchar(255) DEFAULT NULL COMMENT ‘方法名‘, `parent_id` int(6) DEFAULT ‘0‘ COMMENT ‘父id‘, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我没有写关联表,写成了字段,所以取数据时候需要掉一个方法将节点和方法分开
展示数据
wj_role
wj_node
登录的时候判断是否有权限操作,我这里将权限判断卸载model层中
基础类
1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: cheny 5 * Date: 2017/8/22 6 * Time: 21:10 7 */ 8 9 namespace app\\admin\\controller; 10 use think\\Controller; 11 use think\\Request; 12 use think\\Session; 13 use think\\Url; 14 15 /** 16 * Class Base 17 * 基础类 18 */ 19 class Base extends controller 20 { 21 //Request实例 22 protected $request; 23 24 /** 25 * 构造函数 26 * Base constructor. 27 * @param Request|null $request 28 */ 29 public function __construct(Request $request = null) 30 { 31 parent::__construct($request); 32 //直接实例化request类方便后期调用 33 $this->request = $request; 34 if(!Session::get("id")){ 35 $this->error(‘请先登录‘,Url::build("login/index")); 36 } 37 //获取权限 38 $pri=Session::get("node"); 39 // 40 // //当前模块、控制器、方法 41 42 $controller =mb_strtolower($this->request->controller()); 43 $action =mb_strtolower($this->request->action()); 44 $now= url(); 45 // 46 // 如果是首页相关的模块是允许查看的 47 if(($controller=="index")){ 48 return; 49 } 50 51 // //权限判断 无权限无法操作 52 if($pri!="*" && !in_array($now,$pri)){ 53 exit($this->permissionDeny()); 54 } 55 // 56 } 57 /** 58 * 提示权限不足信息 59 * @return \\think\\response\\View 60 */ 61 public function permissionDeny() 62 { 63 return $this->error(‘没有权限‘,Url::build("index/index1")); 64 } 65 }
Model层
<?php /** * Created by PhpStorm. * User: cheny * Date: 2017/9/3 * Time: 14:39 */ namespace app\\admin\\Model; use think\\Model; use think\\Session; use think\\Url; use app\\admin\\Model\\Role; use app\\admin\\Model\\Node; /** * Class Admin * @package app\\admin\\Model */ class Admin extends Model { protected $table =‘wj_admin‘; protected $pk = ‘id‘; protected $autoWriteTimestamp = true; //检查用户是否登录 /** * @param $userArr * @return string */ public function checkLogin($userArr) { $admin = self::get([‘account‘ => $userArr[‘account‘]]); if (empty($admin)) { return ["status" => 1, "msg" => "没有此用户"]; } if ($admin->password != md5($userArr["password"])) { return ["status" => 2, "msg" => "帐号或密码错误"]; } //如果账号密码正确则写入权限 $this->getRole($admin->role_id); Session::set("id", $admin->id); Session::set("account", $admin->account); return ["status" => 0, "route" => Url::build("index/index")]; } /** * @param $role_id */ public function getRole($role_id) { $role =Role::get($role_id); if(empty($role)) { exit (json_encode(["status" => 2, "msg" => "当前用户没有任何权限,无法登录!"])); } $this->getNodeList($role->node_id); } /** * @param $node_list * @return string */ public function getNodeList($node_list) { if ($node_list == "*") { Session::set("node", "*"); // return [‘node‘=>‘*‘]; //将权限表中前两级的当作菜单取出来 // $nlist = Node::where(["parent_id" => 0])->field("id,name")->select(); // $this->getMenu($nlist); } else { $where["id"] = ["in", $node_list]; $plist = Node::where($where)->select(); $plist_arr = collection($plist)->toArray(); //session中生成菜单 //现在的问题是获取的数据中如何找出parent_id=0的。 $this->getParents($plist_arr); } } /** * @param $nodeList */ public function getParents($nodeList) { $parent = []; $pri = []; foreach ($nodeList as $pk => $pv) { if ($pv["parent_id"] == 0) { $parent[] = $pv; } if (strpos($pv["f_name"], ",")) { $pv_arr = explode(",", $pv["f_name"]); $pri[] = url($pv["c_name"]."/".$pv_arr[0]); $pri[] = url($pv["c_name"]."/".$pv_arr[1]); continue; } $pri[] = url($pv["c_name"]."/".$pv["f_name"]);; } //session中生成权限 // return $pri; Session("node",$pri); } }
希望对大家有帮助,框架使用的是thinkphp5.0
以上是关于rbac 权限控制的主要内容,如果未能解决你的问题,请参考以下文章