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系列(五)权限控制的思考

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

  • ThinkPHP5.1权限控制之Think-Casbin和状态管

    ThinkPHP5.1权限控制之Think-Casbin和状态管理PHP-JWT 简介 PHP-Casbin 是一...

  • YII2 初始化

    目录写入权限 默认控制器 config main.php return数组加入//默认控制器'defaultRou...

  • 十一:PHP面向对象

    PHP类权限控制修饰符,成员访问权限 public 可在类的内部、外部、子类中使用 protected 可在类的内...

  • 使用 Casbin 作为 ThinkPHP 的权限控制中间件

    PHP-Casbin 是一个强大的、高效的开源访问控制框架,它支持基于各种访问控制模型的权限管理。 Think-C...

  • Curator 使用(三) ACL 权限控制

    Curator 使用(三) ACL 权限控制 Zookeeper 五种操作权限 总体来说,ZK的节点有5种操作权限...

  • PHP-面向对象

    php类权限控制修饰符public//类的内部,类的外部,子类使用protected//类的内部,子类privat...

  • 控制语句与数组 golang

    if判断 基本控制语句有 if , for , switch 。 if 系列语句和 php 的一些区别,if 条件...

  • Vue权限控制

    需求 页面级别权限控制1.URL路由权限控制2.导航菜单权限控制3.超链接权限控制 元素界别权限控制1.按钮元素权...

  • 安全规约

    五、安全规约 1.【强制】可被用户直接访问的功能必须进行权限控制校验。 说明:防止没有做权限控制就可随意访问、操作...

网友评论

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

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