标签 rbac 下的文章

ThinkPHP RBAC数据库结构简介


ThinkPHP 中的RBAC用到了5个表

think_user (用户表)
think_role (用户分组表)
think_node (操作节点)
think_role_user (用户和用户分组的对应)
think_access (各个操作和用户组的对应)

sql语句如下

-- 表的结构 `think_access`此表为五张表中的权限表
CREATE TABLE IF NOT EXISTS `think_access` (
  `role_id` smallint(6) unsigned NOT NULL,
  `node_id` smallint(6) unsigned NOT NULL,
  `level` tinyint(1) NOT NULL,
  `pid` int(11) DEFAULT NULL,
  KEY `groupId` (`role_id`),
  KEY `nodeId` (`node_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- 表的结构 `think_node`此表为五张表中的节点表
CREATE TABLE IF NOT EXISTS `think_node` (
  `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `title` varchar(50) DEFAULT NULL,
  `pid` smallint(6) unsigned NOT NULL,
  `level` tinyint(1) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `level` (`level`),
  KEY `pid` (`pid`),
  KEY `name` (`name`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
-- 表的结构 `think_role`此表为五张表中的用户组表
CREATE TABLE IF NOT EXISTS `think_role` (
  `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `pid` (`pid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
-- 表的结构 `think_role_user`此表为用户和组对应关系表
CREATE TABLE IF NOT EXISTS `think_role_user` (
  `role_id` mediumint(9) unsigned DEFAULT NULL,
  `user_id` char(32) DEFAULT NULL,
  KEY `group_id` (`role_id`),
  KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- 表的结构 `think_user`此表为用户表
CREATE TABLE IF NOT EXISTS `think_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(100) NOT NULL,
  `password` char(32) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

表Think_access:
Role_ID Node_id pid level
用户组的编号 节点表 节点表中的父ID项 节点表中的等级项
注:如果用户组id和对应的节点id存在这张表中,就表示用户所在的用户组有权限进行对应的操作权限。

表Think_node
id name title pid level
节点编号 节点名称 节点描述 父类编号 级别
节点编号,用来产生关联关系,主键,自增方便索引
节点名称,模块或者动作的名字(严格区分大小写)
节点描述,方便管理员认识和了解
注① :
1)如果是项目名称则项目是顶级的,它上面没有父路径编号(pid),因此pid则为0;例如,网站下有一个Admin项目,它是顶级的。因此没有父路径编号(pid),此处应填0,如果它为第一次插入数据库的,它的id则为1。全字段插入数据库应为:
id name title pid level
1 Admin Admin项目节点 0 1
2)如果某项目下有一个模块。则父路径编号(pid)则为该某块所在的项目编号(id)。例如,Admin下面有一个模块为User,它是第二个插入数据库的。因此,模块的父路径(pid)应填1。全字段插入数据库应为:
id name title pid level
2 User User模块节点 0 2
3)如果在某模块下面有三个动作(或成员方法),分别Index(显示)、insert(插入)、delete(删除),它们三个的父路径为该模块的编号。例如User模块下有Index、insert、delete三个动作或成员方法,它们分别是第三,四,五次插入数据库的。他们的父路径编号(pid)应填2。全字段插入数据库应为:
id name title pid level
3 User User模块下显示动作 0 2
4 Index User模块下插入动作 0 2
5 insert User模块下删除动作 0 2

表think_role
id name
组的编号(主键) 组的名字
注:此表中可以插入父路径编号(pid)产生组的包含关系。对应的父路径编号(pid)为所属组的编号(id)。

表think_user
id username password
用户编号(主键,int类型) 用户名(varchar类型) 密码(char类型32位)
注:id在下一张表中结合think_role产生用户与组的关联关系。建议username设为唯一的,password采用32位md5加密。

表think_role_user
group_id User_id
组编号(主键,int类型) 用户编号(主键,int类型)
注:用户编号(user_id)对应哪一个group_id,则哪个用户就属于哪一个组。可以让同一个用户对应多个组。就意味着,一个用户具有多个组的属性和操作权限。