请选择 进入手机版 | 继续访问电脑版

SpeedPHP框架

 找回密码
 注册成为新用户

QQ登录

只需一步,快速开始

查看: 2017|回复: 1

基于新版SP框架开发的权限类auth

[复制链接]
发表于 2018-2-22 15:19:10 | 显示全部楼层 |阅读模式
本帖最后由 txws2012 于 2018-4-3 21:16 编辑

新年给大家来个开工福利!目前在用新版的sp框架开发一个CMS,但是框架本身没有自带其他类库,就自己弄了一个权限auth类。ps:刚开始想用jake老大发布了CMS系统示例的权限的,但是这个系统的权限有点复杂以及只是对不同用户的后台菜单做了隐藏,知道控制器和动作名称的还是可以直接使用的。

不说了直接上代码(代码有基本注释):
auth.php(放在include目录下)
  1. <?php
  2. /**
  3. * 权限类
  4. * @author 风雨 <1342201051@qq.com>
  5. * @copyright www.icms.xin
  6. */
  7. /*
  8.         -- 表的结构 `i_auth_group`
  9.         CREATE TABLE IF NOT EXISTS `i_auth_group` (
  10.           `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '权限组ID',
  11.           `name` varchar(40) NOT NULL COMMENT '组名称',
  12.           `auths` text COMMENT '组规则',
  13.           `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '用户组状态',
  14.           `remark` varchar(100) DEFAULT NULL COMMENT '组备注',
  15.           PRIMARY KEY (`id`)
  16.         ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='权限组' AUTO_INCREMENT=2 ;
  17.         -- --------------------------------------------------------
  18.         -- 表的结构 `i_auth_group_access`
  19.         CREATE TABLE IF NOT EXISTS `i_auth_group_access` (
  20.           `gid` int(10) unsigned NOT NULL COMMENT '权限组ID',
  21.           `uid` int(10) unsigned NOT NULL COMMENT '用户id',
  22.           PRIMARY KEY (`gid`)
  23.         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户组明细表';
  24.         -- --------------------------------------------------------
  25.         -- 表的结构 `i_auth_rule`
  26.         CREATE TABLE IF NOT EXISTS `i_auth_rule` (
  27.           `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '权限ID',
  28.           `pid` int(10) NOT NULL,
  29.           `title` varchar(40) NOT NULL COMMENT '权限名称',
  30.           `ico` varchar(100) NOT NULL,
  31.           `controller` varchar(100) NOT NULL COMMENT '控制器名称',
  32.           `action` varchar(100) NOT NULL COMMENT '方法名称',
  33.           PRIMARY KEY (`id`)
  34.         ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='认证规则表' AUTO_INCREMENT=9 ;
  35.         -- --------------------------------------------------------
  36. */
  37. class Auth{
  38.         //用户UID
  39.         protected $uid;
  40.         //初始化
  41.         public function __construct(){

  42.         }
  43.         //获取权限列表,用于菜单显示
  44.         public function getAuths($uid = null){
  45.                 //如果uid=1则取得所有菜单,否则按照权限组取得菜单
  46.                 if ($uid == 1) {
  47.                         $auth = M('auth_rule');
  48.                         $auths = $auth->findall();
  49.                 }else{
  50.                         $auths = $this->getUserAuths($uid);
  51.                 }
  52.                 return $this->make_tree($auths);
  53.         }
  54.         //验证权限,不支持参数验证
  55.         public function check($uid = null , $model = 1){
  56.                 //uid=1为创始人,不作权限判断
  57.                 if ($uid == 1) {
  58.                         return true;
  59.                 }
  60.                 //获取用户所拥有的权限
  61.                 $auths = $this->getUserAuths($uid);
  62.                 if(empty($auths)){
  63.                         return false;
  64.                 }
  65.                 //当前路由
  66.                 GLOBAL $__controller, $__action;
  67.         $current = $__controller.'@'.$__action;
  68.                 foreach ($auths as $key => $value) {
  69.                         //是否相等
  70.                         if($value['controller'].'@'.$value['action'] == $current){
  71.                                 return true;
  72.                         }
  73.                         //数据库找不到,返回true
  74.                         $auth = M('auth_rule');
  75.                         $find['controller'] = $auth->find(array('controller' => $__controller),null,'*');
  76.                         $find['action'] = $auth->find(array('action' => $__action),null,'*');
  77.                         if(!($find['controller'] && $find['action'])){
  78.                                 return true;
  79.                         }
  80.                 }
  81.         }
  82.         //获取用户权限列表
  83.         protected function getUserAuths($uid = null){
  84.                 if(empty($uid)){
  85.                         return false;
  86.                 }
  87.                 //获取用户的权限组
  88.                 $auth_users = M('auth_group_access')->find(array('uid' => $uid),null,'*');
  89.                 if(empty($auth_users)){
  90.                         return false;
  91.                 }
  92.                 //根据权限组查找组权限
  93.                 $auth_group = M('auth_group')->find(array('id' => $auth_users['gid']),null,'*');
  94.                 //根据权限规则查找对应的权限
  95.                 $model = M('auth_rule');
  96.                 $sql = "SELECT * FROM {$GLOBALS['mysql']['MYSQL_PRE']}auth_rule
  97.                 WHERE id
  98.                 IN ({$auth_group['rules']})
  99.                 ";
  100.         $auths = $model->query($sql);
  101.                 return $auths;
  102.         }
  103.         //转化树状列表
  104.         protected function make_tree($arr){  
  105.             $refer = array();  
  106.             $tree = array();  
  107.             foreach($arr as $k => $v){  
  108.                 $refer[$v['id']] = & $arr[$k];
  109.             }  
  110.             foreach($arr as $k => $v){  
  111.                 $pid = $v['pid'];   
  112.                 if($pid == 0){  
  113.                     $tree[] = & $arr[$k];   
  114.                 }else{  
  115.                     if(isset($refer[$pid])){  
  116.                         $refer[$pid]['son'][] = & $arr[$k];  
  117.                     }  
  118.                 }  
  119.             }   
  120.             return $tree;  
  121.         }
  122. }
复制代码
使用方法:1、在数据库新建i_auth_group,i_auth_group_access,i_auth_rule三张表,具体数据自行添加
  1. -- 表的结构 `i_auth_group`
  2.         CREATE TABLE IF NOT EXISTS `i_auth_group` (
  3.           `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '权限组ID',
  4.           `name` varchar(40) NOT NULL COMMENT '组名称',
  5.           `auths` text COMMENT '组规则',
  6.           `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '用户组状态',
  7.           `remark` varchar(100) DEFAULT NULL COMMENT '组备注',
  8.           PRIMARY KEY (`id`)
  9.         ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='权限组' AUTO_INCREMENT=2 ;
  10.         -- --------------------------------------------------------
  11.         -- 表的结构 `i_auth_group_access`
  12.         CREATE TABLE IF NOT EXISTS `i_auth_group_access` (
  13.           `gid` int(10) unsigned NOT NULL COMMENT '权限组ID',
  14.           `uid` int(10) unsigned NOT NULL COMMENT '用户id',
  15.           PRIMARY KEY (`gid`)
  16.         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户组明细表';
  17.         -- --------------------------------------------------------
  18.         -- 表的结构 `i_auth_rule`
  19.         CREATE TABLE IF NOT EXISTS `i_auth_rule` (
  20.           `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '权限ID',
  21.           `pid` int(10) NOT NULL,
  22.           `title` varchar(40) NOT NULL COMMENT '权限名称',
  23.           `ico` varchar(100) NOT NULL,
  24.           `controller` varchar(100) NOT NULL COMMENT '控制器名称',
  25.           `action` varchar(100) NOT NULL COMMENT '方法名称',
  26.           PRIMARY KEY (`id`)
  27.         ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='认证规则表' AUTO_INCREMENT=9 ;
  28.         -- --------------------------------------------------------
复制代码

2、在需要权限控制的公共控制器判断,如果uid=1(创始人)不作权限判断
  1. //实例化权限类,并判断用户拥有的权限,具体显示页面自行修改
  2. $authclass = new auth();
  3. if(!$authclass->check($uid){//uid为登陆用户id
  4. echo "没有权限喔!";
复制代码
3、根据用户权限获取后台菜单,如果uid=1(创始人)会获取所有的菜单
  1. $AuthClass = new auth();
  2. $this->menu = $AuthClass->getAuths($uid);//uid为登陆用户id
复制代码
4、后台模板页面代码,具体
  1. /*示例,具体样式自行修改*/
复制代码





您需要登录后才可以回帖 登录 | 注册成为新用户

本版积分规则

手机浏览|简版|中文PHP框架|开源协议|SpeedPHP.com ( 粤ICP备08008671号

GMT+8, 2019-11-19 23:28

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表