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 相关文章推荐
在VS2008中编译MYSQL5.1.48的方法
Jul 03 PHP
PHP Array交叉表实现代码
Aug 05 PHP
php中批量修改文件后缀名的函数代码
Oct 23 PHP
标准PHP的AES加密算法类
Mar 12 PHP
PHP和C#可共用的可逆加密算法详解
Oct 26 PHP
thinkphp配置文件路径的实现方法
Aug 30 PHP
PHP中串行化用法示例
Nov 16 PHP
如何修改Laravel中url()函数生成URL的根地址
Aug 11 PHP
PHP基于递归实现的约瑟夫环算法示例
Aug 27 PHP
thinkPHP框架实现类似java过滤器的简单方法示例
Sep 05 PHP
Laravel框架Request、Response及Session操作示例
May 06 PHP
Yii框架连表查询操作示例
Sep 06 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打造属于自己的MVC框架
2012/03/07 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
2015/10/09 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
2018/06/06 PHP
javascript编程起步(第一课)
2007/01/10 Javascript
Javascript 面向对象特性
2009/12/28 Javascript
kmock javascript 单元测试代码
2011/02/06 Javascript
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
2013/06/26 Javascript
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
Javascript实现快速排序(Quicksort)的算法详解
2015/09/06 Javascript
js添加绑定事件的方法
2016/05/15 Javascript
JS实现登录页密码的显示和隐藏功能
2017/12/06 Javascript
面包屑导航详解
2017/12/07 Javascript
web前端vue filter 过滤器
2018/01/12 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
2018/04/28 jQuery
jQuery实现仿京东防抖动菜单效果示例
2018/07/06 jQuery
Angular6中使用Swiper的方法示例
2018/07/09 Javascript
node.js 如何监视文件变化
2020/09/01 Javascript
深入了解Vue3模板编译原理
2020/11/19 Vue.js
Python标准库之多进程(multiprocessing包)介绍
2014/11/25 Python
Python脚本实现DNSPod DNS动态解析域名
2015/02/14 Python
Python遍历zip文件输出名称时出现乱码问题的解决方法
2015/04/08 Python
python中随机函数random用法实例
2015/04/30 Python
python os.listdir按文件存取时间顺序列出目录的实例
2018/10/21 Python
在python中使用nohup命令说明
2020/04/16 Python
如何解决安装python3.6.1失败
2020/07/01 Python
解决Python 函数声明先后顺序出现的问题
2020/09/02 Python
Python调用ffmpeg开源视频处理库,批量处理视频
2020/11/16 Python
CSS3 media queries + jQuery实现响应式导航
2016/09/30 HTML / CSS
纯CSS3大转盘抽奖示例代码(响应式、可配置)
2017/01/13 HTML / CSS
美国尼曼百货官网:Neiman Marcus
2019/09/05 全球购物
师范教师毕业鉴定
2014/01/13 职场文书
作风建设年度心得体会
2014/10/29 职场文书
2015年酒店前台工作总结
2015/04/20 职场文书
python实现简单石头剪刀布游戏
2021/10/24 Python
springboot+zookeeper实现分布式锁
2022/03/21 Java/Android