RBAC是基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注 - 来自百度百科。

但然ThinkPHP里面也有这方面的操作方法,首先,一般情况,在TP做RBAC前,需要三个表
1、manager 后台用户管理员表
2、role 角色表
3、auth 具体权限表
manager好理解,就是管理员等其他管理员账号存放的,但在这个表里面需要一个权限等级。

--用户表

CREATE TABLE `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

表内容大概就这些,id自增长,name管理员的账号,pwd管理员的密码,time注册时间或者是上次登录时间,role_id角色权限ID,这个可以看最后面role表里面的role_id,例如这个人是经理,那么就可以设置1,如果是员工就是2,相应的权限对于相应的角色。

auth,这个东东相对要绕,先看数据库结构

DROP TABLE IF EXISTS `auth`;
CREATE TABLE `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 '控制器',
  `auth_a` varchar(32) NOT NULL DEFAULT '' COMMENT '操作方法',
  `auth_path` varchar(32) NOT NULL COMMENT '全路径',
  `auth_level` tinyint(4) NOT NULL DEFAULT '0' COMMENT '级别',
  PRIMARY KEY (`auth_id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;

id不用说,name就是后面相关权限名称,比如有商品管理,订单管理,广告管理这些大目录。商品管理,下面又有商品的增删改查,订单管理和广告管理同理。

pid例如商品管理是大目录就是1,商品管理下面的,添加商品就是2,再增加商品删除就是3,这样顺着排下去。
C = Controller 也就是控制器,比如我商品管理这个控制器叫goods,那么就写goods。
a = 操作方法,比如我商品管理这个控制器叫goods,里面有个商品增加我的方法叫add,那么这里就写就写add。
path = 全路径,大目录,比如商品管理,这里就是1,但如果这里是添加商品的话,是在1下面,就写1-2,如果是商品删除就是1-3,用“-”连接。
level = 级别,级别可以自由划分,例如,0顶级权限 1次顶级权限 2次次顶级这样划分下去。
以下是添加到auth表里的模拟数据,也可以根据添加的数据找下规律,反正我头绕昏了。

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

role表这里主要是存放角色的名称,比如说总经理,广告部经理,市场部总监等等,根据不同的角色划分不同的权限。

DROP TABLE IF EXISTS `role`;
CREATE TABLE `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',
  `role_auth_ac` text COMMENT '模块-操作',
  PRIMARY KEY (`role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

role_id,根据角色权限的名字建立,比如建立经理权限,就是1,员工权限就是2,这里面就对于manager里面的role_id这个字段。
name,权限角色名字,好理解。
auth_ids,例如总经理有商品添加和广告列表的权限,根据上面的模拟数据,这里就应该写1,3,5,11。
auth_ac,看上面的1,3是大目录是没有操作模块的,所以空着不用写,5和11有相对的权限,就根据上面的表写过来,"Goods-add,Advert-showlist"。
下面是模拟数据,这个表里面的内容相对比较清爽的。

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");

今天我就看到这里,笔记结束。

最后修改:2016 年 09 月 29 日
如果觉得我的文章对你有用,请随意赞赏