php 一个用户组别访问权限控制的例子
2017-10-16 12:19
513 查看
这是在一个项目中,接触到的比较好的一个权限控制系统,重要的是里面的思想,框架借用了ThinkPHP3.2,其实不用TP也可以,你可以很方便的二次开发。
先说数据库权限相关表的结构:
权限控制器CheckPower的代码:
这里把模块-控制器-方法拼装好,和用户id一起传到权限检查类的check方法中检查。
看一下文件位置:
文件内容:
先说数据库权限相关表的结构:
CREATE TABLE `admin` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '管理员主键', `admin_name` varchar(20) NOT NULL COMMENT '用户名', `password` varchar(32) NOT NULL COMMENT '密码', `last_time` int(11) DEFAULT NULL COMMENT '最近登录时间', `last_ip` varchar(20) DEFAULT NULL COMMENT '最近登录IP', PRIMARY KEY (`id`), UNIQUE KEY `admin_name` (`admin_name`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='管理员用户表'; CREATE TABLE `group` ( `id` int(4) NOT NULL AUTO_INCREMENT COMMENT '主键,标识', `group_name` varchar(14) NOT NULL COMMENT '管理组名称', `group_infor` varchar(200) NOT NULL COMMENT '管理组说明', `rank` int(2) NOT NULL COMMENT '排序', PRIMARY KEY (`id`), UNIQUE KEY `group_name` (`group_name`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='管理员组表'; CREATE TABLE `admin_group` ( `id` int(11) NOT NULL AUTO_INCREMENT, `admin_id` int(11) NOT NULL COMMENT '管理员ID, admin表的主键', `group_id` int(11) NOT NULL COMMENT '管理组id, group表的主键', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='管理员所属管理组表'; CREATE TABLE `webmenu` ( `id` int(11) NOT NULL AUTO_INCREMENT, `menu_name` varchar(20) NOT NULL COMMENT '菜单名', `menu_rank` int(11) NOT NULL COMMENT '排序', `menu_controllers` varchar(200) NOT NULL COMMENT '菜单所属控制器', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='菜单表'; CREATE TABLE `power` ( `id` int(11) NOT NULL AUTO_INCREMENT, `pid` int(3) NOT NULL COMMENT '菜单id, webmenu表的主键', `title` varchar(20) NOT NULL COMMENT '权限名称', `type` int(2) NOT NULL COMMENT '操作类型: 1 操作控制 ; 2 菜单类别; 3 其他类别', `rank` int(2) NOT NULL COMMENT '排序', `power_id` varchar(40) NOT NULL DEFAULT '' COMMENT 'module-controller-action', PRIMARY KEY (`id`), UNIQUE KEY `power_id` (`power_id`) USING BTREE, KEY `id` (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='权限表'; CREATE TABLE `admin_power` ( `id` int(11) NOT NULL AUTO_INCREMENT, `admin_id` int(11) NOT NULL COMMENT '用户id', `power_id` int(11) NOT NULL COMMENT '权限表id', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用户权限表'; CREATE TABLE `group_power` ( `id` int(11) NOT NULL AUTO_INCREMENT, `group_id` int(11) NOT NULL COMMENT '用户组id', `power_id` int(11) NOT NULL COMMENT '权限表id', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用户组权限表'; ";
权限控制器CheckPower的代码:
namespace Home\Controller; use Think\Controller; class CheckPowerController extends Controller { public function _initialize () { // 判断是否登录 $admin_id = $_SESSION['admin_id']; // TP下可以写出session('admin_id'); if ( empty($admin_id) ) { $this->error('登录超时', U('Index/login')); } // 操作方法的权限判断 $auth= new \ClassLib\Power(); if ( !$auth->check( $admin_id, MODULE_NAME.'-'.CONTROLLER_NAME.'-'.ACTION_NAME ) ) { $this->error('你没有权限'); } } }
这里把模块-控制器-方法拼装好,和用户id一起传到权限检查类的check方法中检查。
看一下文件位置:
文件内容:
namespace ClassLib; class Power { // 权限检查 public function check ( $admin_id, $m_c_a_url ) { $power_arr = $this->getAllPowers( $admin_id ); $power = M('power'); $map['power_id'] = strtolower($m_c_a_url); $power_id = $power->field('id')->where( $map )->find(); return in_array($power_id['id'], $power_arr); } // 获取用户(及所在用户组)权限 public function getAllPowers ( $admin_id ) { // 用户个人权限 $power_admin = $this->getPowers( $admin_id, 'admin'); // 获取所属用户组的id $groups_id_arr = $this->getGroups( $admin_id ); // 所属用户组的权限 $power_group = $this->getPowers( $groups_id_arr, 'group'); $power_admin = !empty($power_admin ) ? $power_admin : array(); $power_group = !empty($power_group ) ? $power_group : array(); //合并用户权限 和 用户组权限 $power_arr = array_unique( array_merge( $power_admin, $power_group ) ); return $power_arr; } public function getGroups ( $admin_id ) { $group_ID_arr = NULL; $map['admin_id'] = $admin_id; $data = M("admin_group")->where( $map )->select(); if ( !is_null($data) ) { foreach ($data as $key => $value) { $group_ID_arr[] = $value['group_id']; } } return $group_ID_arr; } public function getPowers ( $ids, $type ) { $power_arr = null; $data = null; if ( $type == 'admin' ) { $condition['admin_id'] = $ids; $data = M("admin_power")->where( $condition )->select(); } elseif ($type == 'group') { $condition['group_id'] = array('in', $ids); $data = M("group_power")->where( $condition )->select(); } if ( !is_null($data) ) { foreach ($data as $key => $value) { $power_arr[] = $value['power_id']; } } return $power_arr; } // 生成菜单 public function getMenu ( $admin_id ) { $power_arr = $this->getAllPowers( $admin_id ); if ( empty($power_arr) ) { exit('好像管理员忘记给你分配权限了。'); } $power = M('power'); $where['id'] = array('in', $power_arr); // 读取到权限的所有属性 $power_list = $power->where($where)->order('rank')->select(); // 所有的菜单大类 $webmenu = M('webmenu'); $webmenu_list = $webmenu->order('menu_rank')->select(); $len_webmenu_list = count($webmenu_list); // 循环把权限属性,整理到菜单数组中去 for ( $i = 0; $i < $len_webmenu_list; $i++ ) { for ( $j = 0; $j < count($power_list); $j++ ) { // 判断这个菜单下有无菜单类型权限 if ( $power_list[$j]['pid'] == $webmenu_list[$i]['id'] ) { $webmenu_list[$i]['power'][$power_list[$j]['id']] = $power_list[$j]; } } } // 菜单html拼接 $menu_html = ''; for ( $i = 0; $i < $len_webmenu_list; $i++ ) { $ispower = false; // 当前菜单是否有子菜单 $menu_li = null; // 当前菜单的子菜单拼装 foreach ( $webmenu_list[$i]['power'] as $key => $value ) { if ( $value['type'] == 2 ) { $action = explode('-', $value['power_id']); $len_action = count($action); if ( $len_action == 3 ) { if ( $action[0] != 'home' ) { $url = $action[0] . '/' . $action[1] . '/' . $action[2]; } else { $url = $action[1] . '/' . $action[2]; } } else { $url = '#'; }
相关文章推荐
- 简介:控制用户访问权限
- php如何控制用户对图片的访问 PHP禁止图片盗链(转载)
- SQL Server 2005控制用户权限访问表
- java项目中普遍存在的一个bug,用户直接可以通过url访问本人没有权限的页面
- PHP ‘ext/soap/soap.c’权限许可和访问控制
- SQL Server 2005 控制用户权限访问表
- MySQL知识(二十一)——用户管理之权限管理、访问控制
- nginx默认虚拟主机,用户认证,域名重定向,日志,静态文件不记录日志,防盗链,访问控制,php解析
- HDFS多用户管理ACL机制other权限访问控制的理解
- SpringSecurity实战! 详细讲解如何通过SpringSecurity控制用户访问权限。
- SQL Server 2005/2008 控制用户权限访问表
- SQL Server 2005 控制用户权限访问表
- sqlserver2008,创建一个用户和对应一个架构,只对这个架构下的表有访问权限
- SQL Server 2005控制用户权限访问表
- SQL Server 2005 控制用户权限访问表
- VMware vSphere vCenter 5.0用户角色访问与权限控制 推荐
- sharepoint:拥有完全控制权限的用户依然“拒绝访问” -- 金大昊(jindahao)
- SQLServer控制用户访问权限表 (本机访问本地数据库 加密)
- 【转载】【权限控制】角色访问动态生成用户权限菜单树(转载: http://www.comprg.com.cn/post_show.asp?id=7873 )