好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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', 形式配置,逗号分隔。

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

超级管理员无需验证

查看更多关于ThinkPHP操作名权限控制的详细内容...

  阅读:45次