ThinkPHP RBAC功能小结
2015-07-03 22:11
766 查看
使用的是ThinkPHP的RBAC模块。(ThinkPHP版本3.1)
一、涉及到5个表:
用户表:user
角色表:role
节点表:node
用户角色关联表:role_user
权限表:access
下面是ThinkPHP3.1版本给出的样例表,可以直接拿来用。
这里需要注意的是几点是:
1. 可以使用自己已经创建的表,但必须要有上面样例表中的所有字段,名字都要一样,这样才能应用系统提供的RBAC功能。否则,需要自己修改ORG.Util.RBAC源码,以适应自己的数据库表结构。
2. 外键关联需要有。
二、设置配置项
修改config.php文件,增加以下配置项(下面是我的项目中设置的,注释掉的并没有设置):
下面是ThinkPHP3.1源码给出的需要增加的配置项参考,
三、增加相应权限控制代码
1、成功登录后,保存登录用户所对应角色的权限到session中:
2、在CommonAction中进行验证判断:(CommonAction是系统所有Action的父类,即进入到任何一个子Action前都要先创建CommonAction,所以会先判断有无权限,无权限直接跳转页面。)
四、整个RBAC模块最重要的是构建出来一个分级的权限数组。即:
应用的level = 1;
控制器的level = 2;
方法的level = 3;
session中会保存这样一份权限数组:
一、涉及到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
相关文章推荐
- 虚拟账号ftp服务器
- PHP中CGI,FastCGI,PHP-CGI与PHP-FPM对比
- php的基础总结
- ThinkPHP 5.数据库基本操作
- ThinkPHP 4.使用Session
- PHP 中 Failed to load resource: the server responded with a status of 500 (Internal Server Error)
- php使用face++实现一个简单的人脸识别系统
- WindowManager.LayoutParams(上)
- ZeroMQ + libevent in PHP
- php遍历多维数组改变数组的值
- ThinkPHP3.2创建view并调用view
- PHP 报告分拣和生产理念
- ecshop安装出现问题集合(php版本偏高)
- PHP如何过滤这样的空白字符?
- php中的json_encode函数
- PHP基本语法以及和Java的区别
- php缓存技术(减少数据库服务器压力)
- yii2-更改默认显示的通用主页
- json在PHP中应用技巧
- 在PHP中使用Mysqli操作数据库