DoraCMS之权限模块
最初的权限管理比较单一,定义了每个大的模块所管辖的范围,只要指定了单个模块,那么该模块下的所有操作都是有权限的,当初是这样设计的,但是最近对代码进行重构中发现了一些严重的漏洞
最近对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; }
设置权限后执行数据删除的效果:
说白了,不想让你看见的,你是无论如何也看不见滴,权限模块已经上线,等测试几天看下是否有漏洞,后面计划把后台放开给大家体验一下,敬请期待:
很赞哦! ( 0
)