使用的是ThinkPHP的RBAC模块。(ThinkPHP版本3.1)
一、涉及到5个表:
用户表:user
角色表:role
节点表:node
用户角色关联表:role_user
权限表:access
下面是ThinkPHP3.1版本给出的样例表,可以直接拿来用。
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,
`module` varchar(50) DEFAULT NULL,
KEY `groupId` (`role_id`),
KEY `nodeId` (`node_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
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,
`status` tinyint(1) DEFAULT '0',
`remark` varchar(255) DEFAULT NULL,
`sort` smallint(6) unsigned DEFAULT NULL,
`pid` smallint(6) unsigned NOT NULL,
`level` tinyint(1) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `level` (`level`),
KEY `pid` (`pid`),
KEY `status` (`status`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `think_role` (
`id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`pid` smallint(6) DEFAULT NULL,
`status` tinyint(1) unsigned DEFAULT NULL,
`remark` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `pid` (`pid`),
KEY `status` (`status`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
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;
这里需要注意的是几点是:
1. 可以使用自己已经创建的表,但必须要有上面样例表中的所有字段,名字都要一样,这样才能应用系统提供的RBAC功能。否则,需要自己修改ORG.Util.RBAC源码,以适应自己的数据库表结构。
2. 外键关联需要有。
二、设置配置项
修改config.php文件,增加以下配置项(下面是我的项目中设置的,注释掉的并没有设置):
//RBAC配置项
'RBAC_SUPERADMIN' => 'admin', //超级管理员名称
'ADMIN_AUTH_KEY' => 'superadmin', //超级管理员识别
'USER_AUTH_ON' => true, //是否开启验证
'USER_AUTH_TYPE' => 1, //验证类型(1:下一次登录生效,2实时生效)
'USER_AUTH_KEY' => 'uid', //用户认证识别号
'NOT_AUTH_MODULE' => '', //无需验证控制器
'NOT_AUTH_ACTION' => '', //无需验证方法
'RBAC_ROLE_TABLE' => 'roles', //角色表名称
'RBAC_USER_TABLE' => 'role_user', //角色与用户中间表名称
'RBAC_ACCESS_TABLE' => 'access', //权限表名称
'RBAC_NODE_TABLE' => 'node', //节点表名称
下面是ThinkPHP3.1源码给出的需要增加的配置项参考,
// 配置文件增加设置
// USER_AUTH_ON 是否需要认证
// USER_AUTH_TYPE 认证类型
// USER_AUTH_KEY 认证识别号
// REQUIRE_AUTH_MODULE 需要认证模块
// NOT_AUTH_MODULE 无需认证模块
// USER_AUTH_GATEWAY 认证网关
// RBAC_DB_DSN 数据库连接DSN
// RBAC_ROLE_TABLE 角色表名称
// RBAC_USER_TABLE 用户表名称
// RBAC_ACCESS_TABLE 权限表名称
// RBAC_NODE_TABLE 节点表名称
三、增加相应权限控制代码
1、成功登录后,保存登录用户所对应角色的权限到session中:
import('Admin.Action.MyRBAC');
MyRBAC::saveAccessList();
2、在CommonAction中进行验证判断:(CommonAction是系统所有Action的父类,即进入到任何一个子Action前都要先创建CommonAction,所以会先判断有无权限,无权限直接跳转页面。)
//*****RBAC
//不用验证的控制器 or 方法
$notAuth = in_array(MODULE_NAME, explode(',', C('NOT_AUTH_MODULE'))) ||
in_array(ACTION_NAME, explode(',', C('NOT_AUTH_ACTION')));
//是否开启权限验证 + 如果是需要验证的控制器or方法
if(C('USER_AUTH_ON') && !$notAuth) {
// import('ORG.Util.RBAC');
// RBAC::AccessDecision() || $this->error('抱歉,您没有权限');
//进行权限验证
import('Admin.Action.MyRBAC');
// dump($_SESSION);die();
MyRBAC::AccessDecision() || $this->error('抱歉,您没有权限');
}
四、整个RBAC模块最重要的是构建出来一个分级的权限数组。即:
应用的level = 1;
控制器的level = 2;
方法的level = 3;
session中会保存这样一份权限数组:
-APPLICATION_ONE
----ACTION_ONE
----------FUNCTION_ONE
----------FUNCTION_TWO
----ACTION_TWO
----------FUNCTION_ONE
-APPLICATION_TWO
----ACTION_THREE
----------FUNCTION_ONE