在thinkphp3.2中,集成了RBAC来实现权限管理。项目中RBAC实现类地址为:ThinkPHP/Librar/Org/Util/Rbac.class.php,里面集成了我们需要的权限管理操作:table设计在thinkPHP的Rbac的Rbac.class.php文件中,一共提供了4张表,还有一张user表需要自己建。下面是我建的权限相关的sql,其中wj_是表前缀,在你的项目中改成表前缀1:permissiontable:CREATETABLEIFNOTEXISTS`wj_access`(`role_id`SMALLINT(6)UNSIGNEDNOTNULLCOMMENT'roleID',`node_id`SMALLINT(6)UNSIGNEDNOTNULLCOMMENT'NodeID',`level`TINYINT(1)NOTNULLCOMMENT'depth',`module`VARCHAR(50)DEFAULTNULLCOMMENT'module',KEY`groupId`(`role_id`),KEY`nodeId`(`node_id`))ENGINE=MYISAMDEFAULTCHARSET=utf8COMMENT='Permissiontable';2:Nodetable:CREATETABLEIFNOTEXISTS`wj_node`(`id`SMALLINT(6)UNSIGNEDNOTNULLAUTO_INCREMENTCOMMENT'nodeID',`name`VARCHAR(20)NOTNULLCOMMENT'nodename',`title`VARCHAR(50)DEFAULTNULLCOMMENT'nodetitle',`status`TINYINT(1)DEFAULT'0'COMMENT'status0disable1enable',`remark`VARCHAR(255)DEFAULTNULLCOMMENT'description',`sort`SMALLINT(6)UNSIGNEDDEFAULTNULLCOMMENT'sort',`pid`SMALLINT(6)无符号不为空COMMENT'parentnode',`level`TINYINT(1)UNSIGNEDNOTNULLCOMMENT'depth',PRIMARYKEY(`id`),KEY`level`(`level`),KEY`pid`(`pid`),KEY`status`(`status`),KEY`name`(`name`))ENGINE=MYISAMDEFAULTCHARSET=utf8COMMENT='nodetable';3:Userroletable:CREATETABLEIFNOTEXISTS`wj_role`(`id`SMALLINT(6)UNSIGNEDNOTNULLAUTO_INCREMENTCOMMENT'角色ID',`name`VARCHAR(20)NOTNULLCOMMENT'角色名称',`pid`SMALLINT(6)DEFAULTNULL'父ID',`status`TINYINT(1)UNSIGNEDDEFAULTNULLCOMMENT'status0disabled1enabled',`remark`VARCHAR(255)DEFAULTNULLCOMMENT'remark',PRIMARYKEY(`id`),KEY`pid`(`pid`),KEY`status`(`status`))ENGINE=MYISAMDEFAULTCHARSET=utf8COMMENT='Userroletable';4:Userroleassociationtable:CREATETABLEIFNOTEXISTS`wj_role_user`(`role_id`MEDIUMINT(9)UNSIGNEDDEFAULTNULLCOMMENT'角色ID',`user_id`CHAR(32)DEFAULTNULLCOMMENT'UserID',KEY`group_id`(`role_id`),KEY`user_id`(`user_id`))ENGINE=MYISAMDEFAULTCHARSET=utf8COMMENT='用户角色关联表';5:用户表:CREATETABLEIFNOTEXISTS`wj_user`(`user_id`INT(11)UNSIGNEDNOTNULLAUTO_INCREMENTCOMMENT'userid',`username`VARCHAR(50)NOTNULLCOMMENT'username',`password`VARCHAR(100)NOTNULLCOMMENT'password',`create_time`INT(10)DEFAULTNULLCOMMENT'创建时间',`update_time`INT(10)DEFAULTNULLCOMMENT'更新时间',`status`INT(1)DEFAULTNULLCOMMENT'状态0禁用1启用',PRIMARYKEY(`user_id`))ENGINE=MYISAMDEFAULTCHARSET=utf8COMMENT='usertable';二:权限操作的常用配置:可以在config.php文件中加入数组://加载扩展配置文件'LOAD_EXT_CONFIG'=>'user'这样我们就可以把我们所有的权限配置都放在user里面了。与config.php同级的php文件,user.php文件配置如下:true,//认证类型1登录认证2实时认证'USER_AUTH_TYPE'=>1,//后台用户认证SESSION标志'USER_AUTH_KEY'=>'wjAuthId',//默认认证网关'USER_AUTH_GATEWAY'=>'?m=admin&c=Login&a=index',//RBAC_DB_DSN数据库连接DSN//角色表名,C('DB_PREFIX')表示前缀'RBAC_ROLE_TABLE'=>C('DB_PREFIX').'role',//用户角色关联表名'RBAC_USER_TABLE'=>C('DB_PREFIX')。'role_user',//权限表名称'RBAC_ACCESS_TABLE'=>C('DB_PREFIX').'access',//节点表名'RBAC_NODE_TABLE'=>C('DB_PREFIX').'node',//默认认证数据表模型'USER_AUTH_MODEL'=>'User',//超级管理员的SESSION标签'ADMIN_AUTH_KEY'=>'wjAdministrator',//默认需要认证模块'REQUIRE_AUTH_MODULE'=>'',//默认认证操作'REQUIRE_AUTH_ACTION'=>'',//默认认证模块'NOT_AUTH_MODULE'=>'Public',//默认认证操作'NOT_AUTH_ACTION'=>'',//是否开启访客授权访问'GUEST_AUTH_ON'=>false,//访客的用户ID'GUEST_AUTH_ID'=>0,//后台用户名的SESSION标志'BACK_LOGIN_NAME'=>'loginBackName',//后台用户的SESSION标志后台角色'BACK_USER_ROLE'=>'bakcUserRole',//后台角色ID的SESSION标志'BACK_ROLE_ID'=>'backRoleId',//后台用户登录时间的SESSION标志'BACK_ONLINE_TIME'=>'backOnlineTime',//后台在线间隔时间,以分钟为单位'ONLINE_INTERVAL'=>180,//注销URL'LOGOUT_URL'=>'/test',);三:权限操作的常用方法:1:Rbac::saveAccessList($authId=null);缓存权限列表,这个方法可以传空值的前提是:需要设置$_SESSION[C('USER_AUTH_KEY')]保存用户的id,然后保存用户对应角色的权限$_SESSION['_ACCESS_LIST']中2:Rbac::checkAccess()判断用户访问的模块和方法是否需要权限认证3:Rbac::AccessDecision()判断用户是否有访问权限,即校验当前项目模块操作是否在$_SESSION['_ACCESS_LIST']数组中,也就是说$_SESSION['_ACCESS_LIST']数组中是否存在$_SESSION'_ACCESS_LIST''当前控制器'。如果有权限,否则返回flase4:Rbac::checkLogin();判断用户是否登录,如果没有,则跳转到指定路径5:Rbac::getAccessList($authId)返回权限列表$_SESSION['通过查询数据库_ACCESS_LIST']值6:Rbac::authenticate($map,$model='')传入查询用户的条件和用户表的MODEL。返回的数组包含用户信息。如果不传model值,则使用配置项USER_AUTH_MODEL4:权限管理的简单实现示例:1:登录://获取传入的用户名和密码$username=I('post.username');$password=I('post.password');//生成认证条件$map=array();$map['username']=$username;$map['status']=array('eq',1);//判断该用户是否存在$authInfo=Rbac::authenticate($map);if(!$authInfo){$this->error('账号不存在');}if($authInfo['password']!=md5($password)){$this->error('密码错误');}$user_id=$authInfo['user_id'];$role_user=newModel();$role=$role_user->Table(C("RBAC_USER_TABLE"))->alias("user")->where("user_id=".$user_id)->join(C("RBAC_ROLE_TABLE")."asroleONrole.id=user.role_id")->field("id,name")->find();if(empty($role)){$this->error('该用户没有对应的角色,无法登录');}//后台角色ID的SESSION标签session(C('BACK_ROLE_ID'),$role['id']);//后台角色SESSION标签session(C('BACK_USER_ROLE'),$role['name']);//后台用户认证SESSION标签session(C('USER_AUTH_KEY'),$authInfo['user_id']);//后台用户名SESSION标志session(C('BACK_LOGIN_NAME'),$authInfo['username']);//后台用户登录时间SESSION标志session(C('BACK_ONLINE_TIME'),time());//判断用户角色是否为超级管理员if($role['id']=='1'){//超级管理员设置超级管理员的SESSION标志为truesession(C('ADMIN_AUTH_KEY'),true);}//缓存访问权限Rbac::saveAccessList();$this->success('登录成功',U('索引/索引'));2:登录成功后的权限验证://验证是否登录Rbac::checkLogin();//用户权限检查if(Rbac::checkAccess()&&!Rbac::AccessDecision()){//没有权限清除登录会话并在以下情况下抛出错误(C('RBAC_ERROR_PAGE')){//定义权限错误页面redirect(C('RBAC_ERROR_PAGE'));}else{if(C('GUEST_AUTH_ON')){//启用访客访问}//提示错误信息$this->error(L('_VALID_ACCESS_'));}}//自动退出函数,判断后台用户登录时间的SESSION标志是否超时if(session(C('BACK_ONLINE_TIME'))+C('ONLINE_INTERVAL')*60
