最近对DoraCMS的权限模块进行了整理,之前的权限模块是这样的:
最初的权限管理比较单一,定义了每个大的模块所管辖的范围,只要指定了单个模块,那么该模块下的所有操作都是有权限的,当初是这样设计的,但是最近对代码进行重构中发现了一些严重的漏洞,因为之前思考不全,会出现这样的情况,例如管理员A没有权限访问文档管理模块,但是依然可以通过指定的接口获得该模块的所有数据,单条数据等,原因是之前只对单一路径进行了权限校验,之前的权限校验的代码是这样的:
//权限校验回调函数
function checkAdminPower(req,key,callBack) {
var uGroupId = req.session.adminUserInfo.group;
AdminGroup.findOne({_id : uGroupId},function(err,result){
if(err){
console.log(err)
}else{
var power = false;
if(result){
var uPower = result.power;
var newPowers = JSON.parse(uPower);
for(var cateName in newPowers){
if(cateName === key && newPowers[cateName]){
power = true;
break;
}
}
}
callBack(power);
}
})
}
看过代码的几个兄弟也提到了,这种不断嵌套可读性比较差,也影响性能,于是都在这次权限改造中一并处理了。
改造后的权限模块是这样的:
这里对所有模块进行了细分,可以对不同角色管理员给定指定区域内的权限,也就不用再纠结给定一个模块,都可以访问的问题。这里借助了jquery 的 ztree 插件,这个插件比较强大,而且我一直在用,api非常丰富,可以满足大多数针对树的需求了,具体可以看官网 :http://www.ztree.me/v3/main.php
这里的权限模块主要用到了这个:用 ztree 方法勾选 checkBox
和之前有些变动的是不再每次都查询用户权限数据,而在用户登录后,或者用户权限改变后缓存权限数据(用户登出必须清除),这样每次做权限校验的时候就快很多了,也不存在多层嵌套的问题:
checkAdminPower : function(req,key){
var power = false;
var uPower = req.session.adminPower;
if(uPower){
var newPowers = eval(uPower);
for(var i=0;i<newPowers.length;i++) {
var checkedId = newPowers[i].split(':')[0];
if(checkedId == key && newPowers[i].split(':')[1]){
power = true;
break;
}
}
}
return power;
}
设置权限后执行数据删除的效果:
说白了,不想让你看见的,你是无论如何也看不见滴,权限模块已经上线,等测试几天看下是否有漏洞,后面计划把后台放开给大家体验一下,敬请期待: 演示地址: 前端开发俱乐部 源码地址: DoraCMS源码
要不是PHP语法混乱,还真不想碰node。