thinkphp自定义权限管理之名称判断方法


Posted in PHP onApril 01, 2017

权限管理,就是给不同的用户分配不同的权限。当用户登录或者操作时候进行判断,来阻止用户进行权限以外的操作。本次讲的是当用户登录一刻,只显示权限开启的内容。

一、建立数据库。

1、权限表funcla。来存储录入所有权限,也是避免因权限名称修改了,权限失效的问题。

thinkphp自定义权限管理之名称判断方法

2、管理员表admin。主要存储管理员用户名等信息。

thinkphp自定义权限管理之名称判断方法

 

3、管理员对应权限表funadmin。主要存储已开启的管理员id与权限id。

thinkphp自定义权限管理之名称判断方法

 

二、输出权限列表。

1、通过管理员列表进入权限分配。

thinkphp自定义权限管理之名称判断方法

2、权限分配列表。

thinkphp自定义权限管理之名称判断方法

关于权限分配列表,因为权限板块的不同,我们需要区别顶级分类与其子集。并且还需要显示权限状态。在权限状态判断中也使用了一层循环判断。代码中采用了三层嵌套循环输出。

具体代码如下

<div>分配管理员{$username}的权限</div>
  <table width="100%" border="0" cellpadding="0" cellspacing="0" class="list_table mt10">
    <tr>
      <th>权限名称</th>
      <th>状态</th>

    </tr>
    <volist name="funcla" id="v" key="j">
       <tr class="tr">
         <td>{$v.claname}</td>
         <td><input <volist name="funadmin" id="d"><if condition="$d['funclaid'] eq $v['id']">checked</if></volist> type="checkbox" id="{$v.id}" name="{$userid}" onchange="return setfun(this,seturl)" /></td>
       </tr>
      <volist name="fun" id="vo">
        <if condition="$vo['clapid'] eq $v['id']">
          <tr class="tr">
            <td style="padding-left: 40px;" >{$vo.claname}</td>

            <td>

              <input <volist name="funadmin" id="d"><if condition="$d['funclaid'] eq $vo['id']">checked</if></volist> type="checkbox" id="{$vo.id}" name="{$userid}" onchange="return setfun(this,seturl)" />

            </td>

          </tr>
        </if>
      </volist>
    </volist>
  </table>
循环示例图如:
thinkphp自定义权限管理之名称判断方法

3、具体控制器如下:

public function setfun(){
    $uid=I('get.id',0,'int');
    $a=M('admin');
    $user=$a->where(array(id=>$uid))->field('username,id')->find();

    $this->username=$user['username'];
    $this->userid=$user['id'];

    $m=M('funcla');
    $funcla=$m->where(array(clapid=>'0'))->field(true)->select();
    $fun=$m->field(true)->select();
    $this->fun=$fun;
    $this->funcla=$funcla;

    $fd=M('funadmin');
    $funadmin=$fd->where(array(adminid=>$uid))->field(true)->select();
    $this->funadmin=$funadmin;
    $this->display();
  }

4、js。当用户权限发生改变时,即触发js提交json,向控制器传递数据参数。

function setfun(t,u){
  var id=$(t).attr('id');
  var uid=$(t).attr('name');
  var type=$(t).is(":checked")?1:0;
  var url=u;
  $.ajax({
    url:url,
    type:'post',
    data:{
      id:id,
      type:type,
      uid:uid
    },
    success:function(data){
    },
    error:function(data){
    }

  })
}

json传递的url地址用过页面中实例化地址获取。如:

<script type="text/javascript">
       var seturl="{:U("Admin/chanefun")}";
</script>

三、控制器获取json的数据参数,判断权限的添加与修改。如果是添加,就向funadmin表中添加受理权限人id与要授权的权限id作为一条数据。修改即删除符合条件的一条数据。同理。

public function chanefun(){

    $m=M('funadmin');
    $where['funclaid']=I('post.id',0,'int');
    $where['adminid']=I('post.uid',0,'int');
    $type=I('post.type',0,'int');
    if(empty($type)){
      $oid=$m->where($where)->getfield('id');
      $m->delete($oid);
      return;
    }
    $m->data($where)->add();
  }

四、真实权限判断。前面都是为权限判断做准备的,现在才是真正的判断,基本原理是把要判断的权限名称与当前登录用户id拿到funadmin表中对比,如有发现则,说明该用户有权限,即显示,否则影藏。影藏了是看不到链接地址,但是如果知道地址则可以通过地址直接访问。

(1)前台判断显示与否。调用了自定义方法chackQ();

<if condition="chackQ('任务管理')">
   <li><a href="{:U('taskinfo/dir')}" rel="external nofollow" >任务管理</a></li>
</if>

(2) 具体对比操作。

function chackQ($name,$state=false){
  if(!$state){ exit; }
  $fun=M('funcla');
  $funclaid=$fun->where(array(claname=>$name))->getfield('id');
  $m=M('funadmin');
  $adminid=session('admin_userid');
  $reset=$m->where(array(funclaid=>$funclaid,adminid=>$adminid))->find();
  if(empty($reset)){
    echo "你没有权限";
    exit;
  }
  return $reset;
}

至此,整个权限控制基本完成。

以上这篇thinkphp自定义权限管理之名称判断方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP中的extract的作用分析
Apr 09 PHP
php4与php5的区别小结(配置异同)
Dec 20 PHP
PHP多线程批量采集下载美女图片的实现代码(续)
Jun 03 PHP
PHP中$_FILES的使用方法及注意事项说明
Feb 14 PHP
PHP缓存机制Output Control详解
Jul 14 PHP
php递归调用删除数组空值元素的方法
Apr 28 PHP
开启PHP Static 关键字之旅模式
Nov 13 PHP
php日期操作技巧小结
Jun 25 PHP
PHP自定义函数实现格式化秒的方法
Sep 14 PHP
php防止表单重复提交实例讲解
Feb 11 PHP
Yii2框架加载css和js文件的方法分析
May 25 PHP
laravel实现上传图片,并且制作缩略图,按照日期存放的代码
Oct 16 PHP
浅谈ThinkPHP中initialize和construct的区别
Apr 01 #PHP
PHP房贷计算器实例代码,等额本息,等额本金
Apr 01 #PHP
PHP中file_put_contents追加和换行的实现方法
Apr 01 #PHP
centos下file_put_contents()无法写入文件的原因及解决方法
Apr 01 #PHP
php file_get_contents取文件中数组元素的方法
Apr 01 #PHP
PHP中Laravel 关联查询返回错误id的解决方法
Apr 01 #PHP
php获取ip及网址的简单方法(必看)
Apr 01 #PHP
You might like
php中对xml读取的相关函数的介绍一
2008/06/05 PHP
PHP实现时间轴函数代码
2011/10/08 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
2018/12/05 PHP
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
JS代码放在head和body中的区别分析
2011/12/01 Javascript
你必须知道的Javascript知识点之&quot;单线程事件驱动&quot;的使用
2013/04/23 Javascript
常见表单重复提交问题整理及解决方法
2013/11/13 Javascript
jquery+php随机生成红包金额数量代码分享
2015/08/27 Javascript
基于javascript实现窗口抖动效果
2016/01/03 Javascript
JS实现获取剪贴板内容的方法
2016/06/21 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
2017/02/14 Javascript
详解nodejs的express如何自动生成项目框架
2017/07/12 NodeJs
vue和webpack安装命令详解
2018/06/15 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
2018/08/14 Javascript
React Native开发封装Toast与加载Loading组件示例
2018/09/08 Javascript
layer弹出层自适应高度,垂直水平居中的实现
2019/09/16 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
vue实现购物车选择功能
2020/01/10 Javascript
D3.js 实现带伸缩时间轴拓扑图的示例代码
2020/01/20 Javascript
Node.js API详解之 dns模块用法实例分析
2020/05/15 Javascript
[01:38]DOTA2 2015国际邀请赛中国区预选赛 Showopen
2015/06/01 DOTA
python logging日志模块的详解
2017/10/29 Python
python opencv实现旋转矩形框裁减功能
2018/07/25 Python
python之Flask实现简单登录功能的示例代码
2018/12/24 Python
Python+Redis实现布隆过滤器
2019/12/08 Python
python django中8000端口被占用的解决
2019/12/17 Python
Django URL参数Template反向解析
2020/11/24 Python
用纯css3和html制作泡沫对话框实现代码
2013/03/21 HTML / CSS
详解html5 postMessage解决跨域通信的问题
2018/08/17 HTML / CSS
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
公司总经理工作职责管理办法
2014/02/28 职场文书
教学质量评估实施方案
2014/03/17 职场文书
考核工作实施方案
2014/03/30 职场文书
服务型党组织建设典型材料
2014/05/07 职场文书
初婚未育证明样本
2014/10/24 职场文书
写给父母的感谢信
2015/01/22 职场文书