zoukankan      html  css  js  c++  java
  • ThinkPHP操作名权限控制

    其实ThinkPHP已经内置了RBAC权限控制,操作也很方便,不过总是感觉平常的小站没有必要用RBAC。有的时候需求很简单,权限控制只检测到操作名上,不细分到方法名上。这样做完全没有必要用RBAC。好处:1.节省时间(有的时候老板定的交工时间是死的)2.懒人你懂的

    权限的逻辑很简单,后台给每个用户添加一个字段,暂且命名为Competenct,  然后写一个给用户赋权限的多选框,类似于

    每个多选框的值就是当前多选框的操作名,比如你有一个ArticleAction.class.php。那么你的value值就是Article。请严格区分大小写,避免平台兼容性。 然后点保存,后台代码:

    foreach($_POST['Competence'] as $v){
    $s.= $v.",";
    }

    把$s插入到Competenct字段里,这样用户表的Competenct字段里面就有了类似于Article,News,Image  这样的一条记录了。

    每个网站的后台都有一个检测是否登录的方法(别跟我说你没有),ThinkPHP里RBAC的介绍:在Action文件夹下新建一个CommonAction.class.php(是不是这个名字我也不清楚了,名字无所谓),里面有个function _initialize() {}方法,你的所有类都继承了CommonAction 这样的话你的所有类操作都会首先进入_initialize()方法,当然、检测是否登录也在这个方法里。建好了这个类咱们先放一边,下一步深入到ThinkPHP/Lib/ORG/Util/下新建一个RUAC.class.php(我邪恶了),代码类似于:

    <?php
    class RUAC extends Think{
    static public function index(){
    $user = M('user');
    $userlist = $user->where('username="'.$_SESSION['username'].'"')->getField('Competence');//查询User表Competence字段里面操作名
    $con = explode(',',$userlist);
    foreach($con as $v){
    if($v == MODULE_NAME ){    //判断有无权限
    return true;
    }
    }
    }
    }
    ?>

    回到CommonAction.class.php

    _initialize()方法里代码:

    if(!in_array(MODULE_NAME,explode(',',C('NOT_AUTH_MODULE'))) && $_SESSION['username'] != 'admin'){ //C('NOT_AUTH_MODULE')  //无需验证模块
    import ( 'ORG.Util.RUAC' );
    if(RUAC::index() != true){
    $this->success('权限不够,请联系管理员开放权限');
    //$this->redirect('Index/index','loading',1);
    }
    }

    后记:

    ThinkPHP/Lib/ORG/Util/下新建一个RUAC.class.php  这里的路径是ThinkPHP2.0的路径,ThinkPHP3.0的路径为ThinkPHP/Extend/Library/ORG/Util

    项目中有用到uploadify的需要把uploadify设置为无需验证模块,否则上传不成功。

    在无需验证模块里的C('NOT_AUTH_MODULE') 配置项是原ThinkPHP RBAC的配置项,这里我引用过来了。无需验证的模块在conf.php里以'NOT_AUTH_MODULE'        =>'Public,Pass', 形式配置,逗号分隔。

    后台登录操作名无需验证,否则登录也都没有权限。

    超级管理员无需验证

    文章均属 松林's blog 原创 转载请注明转自  松林's blog

    本文地址 : http://www.songlin51.com/archives/864.html

  • 相关阅读:
    设置IIS7/IIS7.5的FTP支持断点续传
    win10图片打开方式里没有默认照片查看器的解决方法
    使用C#的HttpWebRequest模拟登陆网站
    在Raid模式下装Win10找不到固态硬盘怎么办
    C# String 前面不足位数补零的方法
    [SQL Server]无法创建 SSIS 运行时对象,请验证 DTS.dll 是否可用及是否已注册
    HTTPS协议说明
    技术晨读_20160217
    技术晨读_20160215
    fastcgi安装
  • 原文地址:https://www.cnblogs.com/liyichong/p/4676591.html
Copyright © 2011-2022 走看看