其实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', 形式配置,逗号分隔。
后台登录操作名无需验证,否则登录也都没有权限。
超级管理员无需验证 |