您的位置:首页 > 编程语言 > PHP开发

ThinkPHP RBAC功能小结

2015-07-03 22:11 766 查看
使用的是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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: