文档章节

rbac 相关

Tony2015
 Tony2015
发布于 2015/04/29 14:16
字数 1093
阅读 15
收藏 0
--用户表
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"));
        }
    }
}


© 著作权归作者所有

共有 人打赏支持
Tony2015
粉丝 1
博文 50
码字总数 28618
作品 0
杭州
程序员
私信 提问
ThinkPHP中RBAC权限带菜单栏显示和详细权限操作

RBAC是什么,能解决什么难题? RBAC是Role-Based Access Control的首字母,译成中文即基于角色的权限访问控制,说白了也就是用户通过角色与权限进行关联[其架构灵感来源于操作系统的GBAC(G...

tinywan1227
2016/09/08
0
0
ThinkPHP 3.0 + Rbac 应用示例

此为Rbac在ThinkPHP中应用的实例,用到了ThinkPHP的Rbac扩展,样式比较难看,大家将就的看。此例子旨在学习交流使用,勿用于实际项目中。 Rbac简单说来就是基于“角色”的权限控制,所有用户...

王昊然
2012/10/16
0
8
ThinkPHP中RBAC的权限控制之配置文件2

本文摘自《草根》杂志第四期 上期我们讲解完了配置文件,基准文件,还有各个功能模块。这一期咱们完成thinkphpRBAC的最后一部份,写完基准类,并实现登陆以及权限的验证功能。 咱们先来说一下...

张沫
2010/10/15
3.5K
1
Kubernetes RBAC (Role-Based Access Control)

基于角色访问控制RBAC 基于角色的访问控制(“RBAC”)使用API组来驱动授权决策,允许管理员通过Kubernetes API动态配置策略。 从Kubernetes 1.8开始,进入稳定版,其API为 要启用RBAC,请启...

Bravepro
2018/06/26
0
0
【视频分享】尚硅谷Java视频教程_RBAC权限实战视频教程

        本视频讲授RBAC权限模型的设计、以及在项目中的应用 。 1. 使用Maven进行项目构建 。 2. 页面设计采用响应式前端框架BootStrap 。 3. 采用多种方式展现用户数据:树形结构(z...

后端编程嘟
2018/05/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Netty如何实现Reactor模式

在前面的文章中(Reactor模型详解),我们讲解了Reactor模式的各种演变形式,本文主要讲解的则是Netty是如何实现Reactor模式的。这里关于Netty实现的Reactor模式,需要说明的是,其实现的模式...

爱宝贝丶
19分钟前
1
0
前端面试:谈谈 JS 垃圾回收机制

摘要: 不是每个人都回答的出来... 原文:前端面试:谈谈 JS 垃圾回收机制 作者:前端小智 最近看到一些面试的回顾,不少有被面试官问到谈谈JS 垃圾回收机制,说实话,面试官会问这个问题,说...

Fundebug
20分钟前
0
0
修改django中的querydict

修改django中的querydict 在正常的请求/响应周期中访问时,request.POST和request.GET上的QueryDicts将是不可变的.要获得可变版本,您需要使用QueryDict.copy().或者,使用一个小技巧 # da...

_Change_
29分钟前
0
0
php简易缓存函数

不需要特别复杂的缓存的时候可以采用简易缓存,设置缓存有效期,有效返回数据,无效返回无效.然后每日清空一下所有缓存.毕竟缓存太多了也占地方 /** * 缓存 * @param $key 缓存名 * @p...

xiaogg
33分钟前
0
0
linux 使用文件增加虚拟内存 swap

之前买了个云服务器玩,不过是最低配置的1核1G,后来发现这个内存太小了,随便装几个软件就不行了,内存消耗较大的像 redis 运行起来很多问题。 这些时间了解了下 docker 容器,去尝试了下发...

非摩尔根
37分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部