日期:2014-05-17  浏览次数:20622 次

ThinkPHP学习笔记(十九)权限管理的实现方式RBAC


Action的方法

<?php
/**
 * 基于权限的角色访问控制
 * Full扩展保重的RBAC.class.php
 * 
 * 安全拦截器
 * 
 * 认证管理器(识别不同身份)
 * 
 * 决策访问管理器(即时模式:立即生效;登录模式:下次登录时生效)
 * 
 * 运行身份管理(单身份、多身份管理B/S)
 * 
 * 
 * 需要当前类和Public和Common类
 * PublicAction:做用户登录和退出
 * CommonAction:初始化接口,需要在这个里面写上一个初始化接口来实现对权限的认证和修改,每个方法都会经过他’
 * 		如果不需要验证的模块,则不需要继承CommonAction
 * 1.去RBAC.class.php中拷贝需要创建的数据库表
 * 		需要修改access表,加入`pid` int(11) NOT NULL,这个字段
		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,
		  `pid` int(11) NOT 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;
 * 
 * 2.创建用户表的必须字段:id、username、password
 * 		五张表的对应关系:
 * 			节点表:think_node
 * 			权限表: think_access(
 * 				项目模块和方法之间的关系;
 * 				用户访问项目(level为1)、模块(level为2)、方法(level为3)直接的关系用节点来表示)
 * 			权限组:think_role
 * 			用户表:tb_user
 * 			用户和组的对应关系:think_role_user
 * 		access控制组与模块方法的关系
 * 3.修改配置文件
 * 4.修改CommonAction
 * 5.当前方法需要继承CommonAction
 */
class RbacAction extends CommonAction{
    public function index(){
    }
    public function add(){
    }
    public function update(){
    }
    public function delete(){
    }
}
?>

下面上一下五张表的数据

tb_user:用户表

Role权限组表

role_user:权限组与用户的对应关系表

node表:表示当前项目中url分类,精确到每个方法的控制

access表:表示不同用户组对应的可以访问的不同url分类

config中需要设置的参数:

//设置rbac的参数
	'USER_AUTH_ON'=>true,
	'USER_AUTH_TYPE'			=>1,		// 默认认证类型 1 登录认证 2 即使认证
	'USER_AUTH_KEY'			=>'authId',	// 用户认证SESSION标记
    'ADMIN_AUTH_KEY'			=>'administrator',//管理员标识
	'USER_AUTH_MODEL'		=>'User',	// 默认验证数据表模型
	'AUTH_PWD_ENCODER'		=>'md5',	// 用户认证密码加密方式
	'USER_AUTH_GATEWAY'	=>'/Public/login',	// 默认认证网关
	'NOT_AUTH_MODULE'		=>'Public',		// 默认无需认证模块
	'REQUIRE_AUTH_MODULE'=>'',		// 默认需要认证模块
	'NOT_AUTH_ACTION'		=>'',		// 默认无需认证操作
	'REQUIRE_AUTH_ACTION'=>'',		// 默认需要认证操作
    'GUEST_AUTH_ON'          => false,    // 是否开启游客授权访问
    'GUEST_AUTH_ID'           =>    0,     // 游客的用户ID(可以在数据库组中设置一个id为0的游客组)
	'SHOW_RUN_TIME'=>true,			// 运行时间显示
	'SHOW_ADV_TIME'=>true,			// 显示详细的运行时间
	'SHOW_DB_TIMES'=>true,			// 显示数据库查询和写入次数
	'SHOW_CACHE_TIMES'=>true,		// 显示缓存操作次数
	'SHOW_USE_MEM'=>true,			// 显示内存开销
    'DB_LIKE_FIELDS'=>'title|remark',
	'RBAC_RO