最近对DoraCMS的权限模块进行了整理,之前的权限模块是这样的:


DoraCMS权限模块.jpg


最初的权限管理比较单一,定义了每个大的模块所管辖的范围,只要指定了单个模块,那么该模块下的所有操作都是有权限的,当初是这样设计的,但是最近对代码进行重构中发现了一些严重的漏洞,因为之前思考不全,会出现这样的情况,例如管理员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);
        }
    })
}

看过代码的几个兄弟也提到了,这种不断嵌套可读性比较差,也影响性能,于是都在这次权限改造中一并处理了。

改造后的权限模块是这样的:


DoraCMS权限模块1.jpg

这里对所有模块进行了细分,可以对不同角色管理员给定指定区域内的权限,也就不用再纠结给定一个模块,都可以访问的问题。这里借助了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权限模块2.jpg

说白了,不想让你看见的,你是无论如何也看不见滴,权限模块已经上线,等测试几天看下是否有漏洞,后面计划把后台放开给大家体验一下,敬请期待: