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编程最快明白》第五讲:php目录、文件操作
Nov 01 PHP
php异常处理技术,顶级异常处理器
Jun 13 PHP
php 模拟 asp.net webFrom 按钮提交事件的思路及代码
Dec 02 PHP
五款PHP代码重构工具推荐
Oct 14 PHP
php实现微信公众平台账号自定义菜单类
Dec 02 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
Mar 03 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
Apr 08 PHP
php抓取网站图片并保存的实现方法
Oct 29 PHP
CodeIgniter多语言实现方法详解
Jan 20 PHP
浅谈PHP中的面向对象OOP中的魔术方法
Jun 12 PHP
php微信开发之音乐回复功能
Jun 14 PHP
CI框架简单分页类用法示例
Jun 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
第七节--类的静态成员
2006/11/16 PHP
深入理解php的MySQL连接类
2013/06/07 PHP
ThinkPHP连接数据库的方式汇总
2014/12/05 PHP
jQuery学习3:操作元素属性和特性
2010/02/07 Javascript
jQuery实现的输入框选择时间插件用法实例
2015/02/28 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
2015/06/05 Javascript
Javascript中String的常用方法实例分析
2015/06/13 Javascript
详解前端自动化工具gulp自动添加版本号
2016/12/20 Javascript
原生js实现可拖动的登录框效果
2017/01/21 Javascript
Javascript中for循环语句的几种写法总结对比
2017/01/23 Javascript
node.js平台下的mysql数据库配置及连接
2017/03/31 Javascript
H5手机端多文件上传预览插件
2017/04/21 Javascript
javascript字体颜色控件的开发 JS实现字体控制
2017/11/27 Javascript
百度地图去掉marker覆盖物或者去掉maker的label文字方法
2018/01/26 Javascript
基于VuePress 轻量级静态网站生成器的实现方法
2018/04/17 Javascript
Babel 入门教程学习笔记
2018/06/13 Javascript
React 无状态组件(Stateless Component) 与高阶组件
2018/08/14 Javascript
转换layUI的数据表格中的日期格式方法
2019/09/19 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
2019/09/21 Javascript
原生js实现九宫格拖拽换位
2021/01/26 Javascript
Python装饰器使用示例及实际应用例子
2015/03/06 Python
Python实现的三层BP神经网络算法示例
2018/02/07 Python
mac下pycharm设置python版本的图文教程
2018/06/13 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
全网最细 Python 格式化输出用法讲解(推荐)
2021/01/18 Python
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
推荐10个HTML5响应式框架
2016/02/25 HTML / CSS
Myprotein蛋白粉美国官网:欧洲畅销运动营养品牌
2016/11/15 全球购物
美国购买隐形眼镜网站:Lenses For Less
2020/07/05 全球购物
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
搞笑创意广告语
2014/03/17 职场文书
应聘教师求职信范文
2015/03/20 职场文书
民间借贷被告代理词
2015/05/23 职场文书
个人合作协议范本
2015/08/06 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书
MyBatis XPathParser解析器使用范例详解
2022/07/15 Java/Android