rbac 相关

--用户表
CREATE TABLE `sw_manager` (
  `mg_id` int(11) NOT NULL AUTO_INCREMENT,
  `mg_name` varchar(32) NOT NULL,
  `mg_pwd` varchar(32) NOT NULL,
  `mg_time` int(10) unsigned NOT NULL COMMENT '时间',
  `mg_role_id` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '角色id',
  PRIMARY KEY (`mg_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8


--权限表
CREATE TABLE `sw_auth` (
  `auth_id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `auth_name` varchar(20) NOT NULL COMMENT '名称',
  `auth_pid` smallint(6) unsigned NOT NULL COMMENT '父id',
  `auth_c` varchar(32) NOT NULL DEFAULT '' COMMENT '控制器',
  controller控制器 Goods
  `auth_a` varchar(32) NOT NULL DEFAULT '' COMMENT '操作方法',
  action  方法 showlist
  `auth_path` varchar(32) NOT NULL COMMENT '全路径',
  全路径:用户信息排序使用
  ① : 如果是顶级权限,全路径等于本记录主键值
  ② :如果不是顶级权限,全路径等于 "父级全路径-(中恒线)本记录主键值"
  `auth_level` tinyint(4) NOT NULL DEFAULT '0' COMMENT '级别',
  基本:0顶级权限  1次顶级权限  2次次顶级
  权限呈现缩进关系使用
  PRIMARY KEY (`auth_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

权限数据模拟:
insert into sw_auth values (1,'商品管理',0,'','',1,0);
insert into sw_auth values (2,'订单管理',0,'','',2,0);
insert into sw_auth values (3,'广告管理',0,'','',3,0);
insert into sw_auth values (4,'商品列表',1,'Goods','showlist',"1-4",1);
insert into sw_auth values (5,'添加商品',1,'Goods','add',"1-5",1);
insert into sw_auth values (6,'商品分类',1,'Goods','cate',"1-6",1);
insert into sw_auth values (7,'用户评论',1,'User','comment',"1-7",1);
insert into sw_auth values (8,'订单列表',2,'Order','showlist',"2-8",1);
insert into sw_auth values (9,'订单打印',2,'Order','print',"2-9",1);
insert into sw_auth values (10,'添加订单',2,'Order','add',"2-10",1);
insert into sw_auth values (11,'广告列表',3,'Advert','showlist',"3-11",1);
insert into sw_auth values (12,'广告位置',3,'Advert','position',"3-12",1);



--角色表
CREATE TABLE `sw_role` (
  `role_id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `role_name` varchar(20) NOT NULL COMMENT '角色名称',
  `role_auth_ids` varchar(128) NOT NULL DEFAULT '' COMMENT '权限ids,1,2,5',
  "4,5,6" 关联权限的主键值用逗号连接的信息(如果有上级权限,也把上级权限的id进行关联)
  `role_auth_ac` text COMMENT '模块-操作',
  关联权限的控制器、方法连接的信息
  "Goods-showlist,Goods-add,Goods-cate"
  PRIMARY KEY (`role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

角色数据模拟:
insert into sw_role values (1, '经理', "1,4,5,6","Goods-showlist,Goods-add,Goods-cate");
insert into sw_role values (2, '主管', "2,3,8,11","Order-showlist,Advert-showlist");


角色:
    董事长
    总监
    高级经理
    经理
    项目经理
    业务主管
    客服
    技术支持
    美工
    员工

php后台首页控制器代码

<?php

//后台首页控制器
//商品控制器
namespace Admin\Controller;
use Component\AdminController;

class IndexController extends AdminController{
    //首页frameset html框架集成方法
    function index(){
        $this -> display();
    }
    
    //展现后台头部页面
    function head(){
        //获得当前系统都给我们提供了什么常量可供使用(系统和自定义的)
        //get_defined_constants([true])
        //true参数会把常量进行自动分组显示
        //var_dump(get_defined_constants(true));
        
        $this -> display();
    }
    //左边页面
    function left(){
        //根据session用户id信息查询角色id信息
        $sql = "select * from sw_manager where mg_id=".$_SESSION['mg_id'];
        $minfo = D()->query($sql);
        $role_id = $minfo[0]['mg_role_id'];
        //根据角色信息获得权限ids的信息
        $sql = "select * from sw_role where role_id=".$role_id;
        $rinfo = D()->query($sql);
        $auth_ids = $rinfo[0]['role_auth_ids'];
        //根据$auth_ids查询全部拥有的权限信息
        //① 获得顶级权限
        $sql = "select * from sw_auth where auth_level=0 ";
        //如果是admin管理员要现实全部权限
        if($_SESSION['mg_id'] != 1){
            $sql .= " and auth_id in ($auth_ids)";
        }
        $p_info = D()->query($sql);
        //② 获得次顶级权限
        $sql = "select * from sw_auth where auth_level=1";
        //如果是admin管理员要现实全部权限
        if($_SESSION['mg_id'] != 1){
            $sql .= " and auth_id in ($auth_ids)";
        }
        $s_info = D()->query($sql);
        
        $this -> assign('pauth_info',$p_info);
        $this -> assign('sauth_info',$s_info);
        $this -> display();
    }
    //右边页面
    function right(){
        $this -> display();
    }
    
}

普通控制器父类 做权限过滤用

<?php

//普通控制器的父类
namespace Component;
use Think\Controller;

class AdminController extends Controller{
    //构造方法
    function __construct() {
        //先执行父类的构造方法,否则系统要报错
        //因为原先的构造方法默认是被执行的
        parent::__construct();
        
        
        //CONTROLLER_NAME ---Goods
        //ACTION_NAME  ----showlist
        //当前请求操作
        $now_ac = CONTROLLER_NAME."-".ACTION_NAME;
        
        //过滤控制器和方法,避免用户非法请求
        //通过角色获得用户可以访问的控制器和方法信息
        $sql ="select role_auth_ac from sw_manager a join sw_role b on a.mg_role_id=b.role_id where a.mg_id=".$_SESSION['mg_id'];
        $auth_ac = D()->query($sql);
        $auth_ac = $auth_ac[0]['role_auth_ac'];
        
        //判断$now_ac是否在$auth_ac字符串里边有出现过
        //strpos函数如果返回false是没有出现,返回0 1 2 3表示有出现
        //管理员不限制
        //默认以下权限没有限制
        //Index/left  Index/right  Index/head  Index/index  Manager/login
        $allow_ac = array('Index-left','Index-right','Index-head','Index-index','Manager-login');
        if(!in_array($now_ac,$allow_ac) && $_SESSION['mg_id'] !=1 && strpos($auth_ac,$now_ac) === false){
            $this -> error('没有权限访问',U("Index/right"));
        }
    }
}


你可能感兴趣的:(rbac 相关)