php系列(五)权限控制的思考

作者: b12af9baadf4 | 来源:发表于2016-09-01 22:56 被阅读0次

    权限控制

    说到权限控制,有人不明白为什么要单独设计权限模块,难道不能直接在代码里面直接写死一些权限的控制吗?

    是的,确实可以,但是如果你需要更换权限的时候不改动代码的话,那你就需要好好设计一下权限这个模块。

    权限控制的三要素:用户-用户组-节点,正是这3者之间扯不清的关系,形成了权限控制的复杂性。(注:节点:用户的任何的一个操作都被称为节点)

    RBAC权限控制

    很多人在做权限控制的时候习惯性的去使用RBAC这种方式:用户对应用户组,用户组对应节点,用户组拥有的权限即这个用户所有的权限。

    这种方式有个比较明显的缺点:

    • 颗粒太粗:权限控制只能到分组,当管理员组下面有100个用户,这100个用户需要根据每个用户的积分值情况再分配不同的权限,那这个就很难实现。

    RBAC的这种缺陷,我们的auth权限控制可以弥补!

    AUTH权限控制的优势

    • 粒度很细:能在分组下再根据用户的一些属性进行权限的分配。

    先来看看RBAC的表设计

    用户表:

    用户名称  积分
    小明      188
    小红      233  
    小花      92
    

    用户组表:

    用户组名称
    一级管理员组
    二级管理员组
    三级管理员组
    超级管理员组
    

    节点表:

    节点说明    节点名称                
    抽奖        activity/chou          
    抢红包      activity/qiang
    砸金蛋      activity/za
    

    用户组与节点关系表:

    用户组      权限
    管理员组    抽奖,抢红包,砸金蛋
    

    用户与用户组关系表:

    用户        用户组   
    小明        管理员组
    

    RBAC的权限判断也很简单:
    (1)根据用户得到用户组
    (2)根据用户组得到节点
    (3)判断需要验证的节点是否在用户所拥有的节点列表中,在就有权限,不在就没有权限

    再来看看AUTH的表设计

    用户表:

    用户名称  积分
    小明      188
    小红      233  
    小花      92
    

    用户组表:

    用户组名称
    一级管理员组
    二级管理员组
    三级管理员组
    超级管理员组
    

    节点表:

    节点说明    节点名称                附加规则
    抽奖        activity/chou          {score}>1 &&{score}<100
    抢红包      activity/qiang         {score}>100 &&{score}<200
    砸金蛋      activity/za            {score}>200 &&{score}<300
    

    用户组与节点关系表:

    用户组      权限
    管理员组    抽奖,抢红包,砸金蛋
    

    用户与用户组关系表:

    用户        用户组   
    小明        管理员组
    

    光看上面的表设计,其实我们可出看出两者的区别:
    在节点表的设计中,auth比rbac多了一个附加规则的字段。
    多了一个字段也就多了一个判断,AUTH权限判断步骤如下:
    (1)根据用户得到用户组
    (2)根据用户组得到节点
    (3)判断需要验证的节点是否在用户所拥有的节点列表中,在的话进行步骤4的判断,不在的话直接提示没有权限
    (4)如果有附件条件,再判断下用户的属性是否符合附加条件,符合才返回符合权限,否则返回没有权限。

    关于condition条件的判断代码实现的逻辑

    前面我们看到节点表里面,多加了一个condition字段,这个字段的写法是{score}>100 &&{score}<200,我们在权限判断的时候,先用正则替换的方式将这句话变成$user['score']>100&&$user['score']<200,然后用eval函数执行这段话,然后记录这个语句的返回值true/false来作为判断是否有权限的依据。

    AUTH权限控制存在的不足

    由于AUTH权限的节点表设计的时候多加了一个condition字段,对节点进行验证的时候,比如有一个节点是审核操作,condition是score>100,如果需求是用户是初级管理员组必须score>100才能进行审核操作,而高级管理员组却可以直接进行审核操作,那么对于这种权限控制,auth也无法控制,因为多个组共享了一个节点的condition。

    关于权限控制,如果大家有好的操作方式,一起探讨。

    相关文章

      网友评论

        本文标题:php系列(五)权限控制的思考

        本文链接:https://www.haomeiwen.com/subject/osxhettx.html