TP后台权限管理笔记

云原生航海家
• 阅读 6077
//管理员表
CREATE TABLE `qz_admin` (
  `admin_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `admin_name` varchar(60) NOT NULL DEFAULT '' COMMENT '用户名',
  `email` varchar(60) NOT NULL DEFAULT '' COMMENT 'email',
  `password` varchar(32) NOT NULL DEFAULT '' COMMENT '密码',
  `add_time` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
  `last_login` int(11) NOT NULL DEFAULT '0' COMMENT '最后登录时间',
  `last_ip` varchar(15) NOT NULL DEFAULT '' COMMENT '最后登录ip',
  `nav_list` text NOT NULL COMMENT '权限',
  `role_id` smallint(5) DEFAULT NULL COMMENT '角色id',
  PRIMARY KEY (`admin_id`),
  KEY `user_name` (`user_name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
//角色表
CREATE TABLE `qz_admin_role` (
  `role_id` smallint(6) unsigned NOT NULL AUTO_INCREMENT COMMENT '角色ID',
  `role_name` varchar(30) DEFAULT NULL COMMENT '角色名称',
  `act_list` text COMMENT '权限列表',
  `role_desc` varchar(255) DEFAULT NULL COMMENT '角色描述',
  PRIMARY KEY (`role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
//功能菜单表
CREATE TABLE `qz_system_menu` (
  `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL COMMENT '权限名字',
  `group` varchar(20) DEFAULT NULL COMMENT '所属分组',
  `right` text COMMENT '权限码(控制器+动作)',
  `is_del` tinyint(1) DEFAULT '0' COMMENT '删除状态 1删除,0正常',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;
function getMenuList($act_list){
    //根据角色权限过滤菜单
    $menu_list = getAllMenu();
    if($act_list != 'all'){
        $right = M('system_menu')->where("id in ($act_list)")->cache(false)->getField('right',true);
        $role_right = "";
        foreach ($right as $val){
            $role_right .= $val.',';
        }
        $role_right = explode(',', $role_right);
        foreach($menu_list as $k=>$mrr){
            foreach ($mrr['sub_menu'] as $j=>$v){
                if(!in_array($v['control'].'Controller@'.$v['act'], $role_right)){
                    unset($menu_list[$k]['sub_menu'][$j]);//过滤菜单
                }
            }
        }
    }
    return $menu_list;
}
function getAllMenu(){
    return    array(
            'system' => array('name'=>'系统设置','icon'=>'fa-cog','sub_menu'=>array(
                    array('name'=>'网站设置','act'=>'index','control'=>'System'),
                    array('name'=>'友情链接','act'=>'linkList','control'=>'Article'),
                    array('name'=>'自定义导航','act'=>'navigationList','control'=>'System'),
                    array('name'=>'区域管理','act'=>'region','control'=>'Tools'),
                    array('name'=>'权限资源列表','act'=>'right_list','control'=>'System'),
            )),
            'access' => array('name' => '权限管理', 'icon'=>'fa-gears', 'sub_menu' => array(
                    array('name' => '管理员列表', 'act'=>'index', 'control'=>'Admin'),
                    array('name' => '角色管理', 'act'=>'role', 'control'=>'Admin'),
                    array('name' => '供应商管理', 'act'=>'supplier', 'control'=>'Admin'),
                    array('name' => '管理员日志', 'act'=>'log', 'control'=>'Admin'),
            )),
            'member' => array('name'=>'会员管理','icon'=>'fa-user','sub_menu'=>array(
                    array('name'=>'会员列表','act'=>'index','control'=>'User'),
                    array('name'=>'会员等级','act'=>'levelList','control'=>'User'),
            )),
            'article' => array('name' => '文章管理', 'icon'=>'fa-comments', 'sub_menu' => array(
                    array('name' => '文章列表', 'act'=>'articleList', 'control'=>'Article'),
                    array('name' => '文章分类', 'act'=>'categoryList', 'control'=>'Article'),
                    array('name' => '专题列表', 'act'=>'topicList', 'control'=>'Topic'),
            ))
    );
}
//权限验证函数(TP), 入口初始化执行
public function check_priv()
{
    $ctl = CONTROLLER_NAME;
    $act = ACTION_NAME;
    $act_list = session('act_list');
    //无需验证的操作
    $uneed_check = array('login','logout','vertifyHandle','vertify','imageUp','upload','login_task');
    if($ctl == 'Index' || $act_list == 'all'){
        //后台首页控制器无需验证,超级管理员无需验证
        return true;
    }elseif(strpos('ajax',$act) || in_array($act,$uneed_check)){
        //所有ajax请求不需要验证权限
        return true;
    }else{
        $role_right = "";
        $right = M('system_menu')->where("id in ($act_list)")->cache(true)->getField('right',true);
        foreach ($right as $val){
            $role_right .= $val.',';
        }
        $role_right = explode(',', $role_right);
        //检查是否拥有此操作权限
        if(!in_array($ctl.'Controller@'.$act, $role_right)){
            $this->error('您没有操作权限,请联系超级管理员分配权限',U('Admin/Index/index'));
        }
    }
}
//权限分配,给角色添加、修改权限
public function role_info(){
    $role_id = I('get.role_id');
    $tree = $detail = array();
    if($role_id){
        $detail = M('admin_role')->where("role_id=$role_id")->find();
        $detail['act_list'] = explode(',', $detail['act_list']);
        $this->assign('detail',$detail);
    }
    $right = M('system_menu')->order('id')->select();
    foreach ($right as $val){
        if(!empty($detail)){
            $val['enable'] = in_array($val['id'], $detail['act_list']);
        }
        $modules[$val['group']][] = $val;
    }
    //权限组(对应数据表里面的group字段)
    $group = array('system'=>'系统管理','access'=>'权限管理',article'=>'文章管理','member'=>'会员管理');
    $this->assign('group',$group);
    $this->assign('modules',$modules);
    $this->display();
}
//权限分配保存
public function roleSave(){
    $data = I('post.');
    $res = $data['data'];
    $res['act_list'] = is_array($data['right']) ? implode(',', $data['right']) : '';
    if(empty($data['role_id'])){
        $r = D('admin_role')->add($res);
    }else{
        $r = D('admin_role')->where('role_id='.$data['role_id'])->save($res);
    }
    if($r){
        adminLog('管理角色',__ACTION__);
        $this->success("操作成功!",U('Admin/Admin/role_info',array('role_id'=>$data['role_id'])));
    }else{
        $this->success("操作失败!",U('Admin/Admin/role'));
    }
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java中比较两个时间的差值
项目背景1.某篇文稿的发布时间是publishDate,例如:2020072118:00:41。2.现要求判断该篇文稿的发布时间是否在近30天之内。publicstaticlongdayDiff(DatecurrentDate,DatepublishDate){LongcurrentTimecurrentDat
虾米大王 虾米大王
2年前
java代码006
code006.jsp隐藏注释的应用用户名:虾米大王部门:Javaweb部门权限:系统管理员
Stella981 Stella981
3年前
KaliTools说明书+BurpSuit实战指南+SQL注入知识库+国外渗透报告
!(https://oscimg.oschina.net/oscnet/d1c876a571bb41a7942dd9752f68632e.gif"15254461546.gif")0X00KaliLinux Tools中文说明书!(https://oscimg.oschina.net/oscnet/
Wesley13 Wesley13
3年前
030 SSM综合练习06
1.权限操作涉及的三张表(1)用户表信息描述users!(https://oscimg.oschina.net/oscnet/a4a2b1f943cbc2db1c8ddd613e7ed00a9ae.png)sql语句:CREATETABLEusers(idVARCHAR2(32)DEFAU
Wesley13 Wesley13
3年前
MySQL总结(十一)子查询
!(https://oscimg.oschina.net/oscnet/upa344f41e81d3568e3310b5da00c57ced8ea.png)子查询1\.什么是子查询需求:查询开发部中有哪些员工selectfromemp;通
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
mysql用户
1\.学会能按着需求创建一个帐号2\.知道连接字符串是什么样3\.密码密码怎么恢复mysql用户权限介绍mysql用户管理 !(https://oscimg.oschina.net/oscnet/368d3c1e00a0a9515545c2962660a27a080.png)!(https://oscimg.oschin
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
oracle数据库逐步学习总结【基础二】
原创作品,转载请在文字开头明显位置注明出处:https://www.cnblogs.com/sunshine5683/p/10067872.html接着上一篇,继续总结!五、oracle表管理首先,在开头说一下sys用户和system用户的区别:sys用户是超级管理员,权限最大,system是系统管理员,权限次之,一般在管理系统时使用system
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(