基于thinkphp3.2.3开发的CMS内容管理系统(二)- Rbac用户权限
在后台管理模块中,每个用户都属于相应的角色组,例如用户 admin 属于超级管理员角色组,用户 dee 属于普通管理员角色组,用户 jane 属于销售角色组,用户 nicole 属于财务角色组,每个角色组拥有的权限都不同。用户和角色组属于多对多的关系,即一个用户可能属于多个角色组,一个角色组有多个用户。
所有模块(例如 Home、Admin)、控制器(Controller)、方法(Action)都是节点,角色组是否能够访问这些节点的信息即是该角色组的权限信息。角色组和节点也是多对多的关系,即一个角色组可以访问多个节点,多个角色组都有可以访问同一个节点。
基于thinkphp3.2.3开发的CMS内容管理系统
thinkphp版本:3.2.3
功能:
–分类栏目管理
–文章管理
–商品管理
–用户管理
–角色管理
–权限管理
–友情链接管理
–系统设置
目前占时这些功能,更多功能还在开发中…
此次版本新增的有:商品管理、角色管理、权限管理
本篇文章我们主要来看看,Rbac用户权限
RBAC(Role-Based Access Controll)基于角色的访问控制
在 ThinkPHP3.2.3 中 RBAC 类位于 /ThinkPHP/Library/Org/Util/Rbac.class.php
一、Rbac原理和数据表:
在后台管理模块中,每个用户都属于相应的角色组,例如用户 admin 属于超级管理员角色组,用户 dee 属于普通管理员角色组,用户 jane 属于销售角色组,用户 nicole 属于财务角色组,每个角色组拥有的权限都不同。用户和角色组属于多对多的关系,即一个用户可能属于多个角色组,一个角色组有多个用户。
所有模块(例如 Home、Admin)、控制器(Controller)、方法(Action)都是节点,角色组是否能够访问这些节点的信息即是该角色组的权限信息。角色组和节点也是多对多的关系,即一个角色组可以访问多个节点,多个角色组都有可以访问同一个节点。
即 Rbac 功能需要 5 张数据表:用户表、角色表、用户-角色中间表、节点表、角色-节点中间表(权限表)。在 Rbac.class.php 中系统已经给出了其中的 4 张表:角色表(role)、用户-角色中间表(role_user)、节点表(node)、权限表(access):
/* -- -------------------------------------------------------- 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; */
需要自己创建一张用户表:
CREATE TABLE `crm_user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `username` char(20) NOT NULL DEFAULT \'\', `password` char(32) NOT NULL DEFAULT \'\', `logintime` int(10) unsigned NOT NULL, `loginip` varchar(30) NOT NULL, `lock` tinyint(1) unsigned NOT NULL DEFAULT \'0\', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8
数据模型如下:
基本的原理是,在配置文件中配置用户登录的识别号,这个识别号是用户的 id,在用户进行登陆的时候把 id 存储在 Session 中,同时根据 Session 保存的识别号通过连表查询获取该用户所属角色所能访问的节点信息并做判断。
二、配置选项
在 Rbac.class.php 中给出了需要配置的信息:
// 配置文件增加设置 // 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 节点表名称
在模块配置文件 ./Application/Admin/Conf/config.php 中添加:
//\'配置项\'=>\'配置值\' \'SHOW_PAGE_TRACE\'=>true, //显示页面调试Trace信息,默认为false //Rbac权限访问控制配置 \'RBAC_SUPERADMIN\'=>\'admin\', //超级管理员名称 \'ADMIN_AUTH_KEY\'=>\'admin\', //超级管理员识别,存放在Session中 \'USER_AUTH_ON\'=>ture, //是否开启权限认证,false,ture \'USER_AUTH_TYPE\'=>1, //验证类型 1-登陆时验证 2-实时验证 \'USER_AUTH_KEY\'=>\'admin_id\', //存储在session中的用户识别号ID \'NOT_AUTH_MODULE\'=>\'Index\', //无需验证的控制器 \'NOT_AUTH_ACTION\'=>\'index\', //无需验证的方法 \'RBAC_ROLE_TABLE\'=>\'blog_role\', //角色表名称 \'RBAC_USER_TABLE\'=>\'blog_role_user\', //角色与用户的中间表名称(注意) \'RBAC_ACCESS_TABLE\'=>\'blog_access\', //权限表名称 \'RBAC_NODE_TABLE\'=>\'blog_node\', //节点表名称
三、开发实例
需要开发以下功能,顺序是:
①【添加角色 → 角色列表】 →
②【添加节点 → 节点列表】 →
③【权限列表 → 分配权限】 →
④【添加用户 → 用户列表 】 →
⑤【Rbac 配置】→
⑥【登陆】
步骤开始:
①【添加角色 → 角色列表】 →
在后台模块新建 Rbac 控制器:./Application/Admin/Controller/Rbac.class.php
//角色管理 public function role(){ $role = M(\'Role\'); // 实例化对象 $count = $role->where(\'status=1\')->count();// 查询满足要求的总记录数 $Page = new \Think\Page($count,25);// 实例化分页类 传入总记录数和每页显示的记录数(25) $show = $Page->show();// 分页显示输出 // 进行分页数据查询 注意limit方法的参数要使用Page类的属性 $list = $role->where(\'status=1\')->order(\'id\')->limit($Page->firstRow.\',\'.$Page->listRows)->select(); //var_dump($list);exit; $this->assign(\'list\',$list);// 赋值数据集 $this->assign(\'page\',$show);// 赋值分页输出 $this->display(); // 输出模板 } //角色添加 public function role_add(){ if(IS_POST){ $m = M("Role"); $data = $m->create(); $res = $m->add($data); if($res>0){ $this->success(\'添加成功!\',U(\'role\')); }else{ $this->error(\'添加失败!\'); } return; } $this->display(); } //角色禁用 public function role_delete(){ $m = M(\'Role\'); $id = $_GET[\'id\']; $res = $m->where("id = {$id}")->setField(\'status\',0); if($res>0){ $this->success(\'角色已禁用!\',U(\'role\')); }else{ $this->error(\'禁用失败!\'); } }
③【权限列表 → 分配权限】 →
②【添加节点 → 节点列表】 →
时间比较仓促,功能可能不太完善,后面会慢慢修改;
后台比较简单,功能不太完整,后续还在陆续增加功能,希望各位大神指点~
日期:2020.5.5
作者:赖忠标
坐标:广州