背景

在权限管理中一般分为两类:操作权限、数据权限

操作权限:是用户是否能使用某个功能的接口权限。
数据权限:是用户是否能操作某个范围的数据,例如:订单记录修改接口,“用户”只能修改所属的(用户A不能修改用户B的订单记录),“admin”可修改所有的。

现有权限管理一般是基于RBAC(Role-Based Access Control)模型,都只能解决操作权限的控制,即使粒度再小(如把订单权限划分为增、删、改、查权限)也不能解决数据权限的问题。

操作权限与数据权限的关系,下面是个例子:

admin和张三(员工)都有公寓大门的钥匙,他们都能进入公寓(访客不能进入),虽然他们都能进公寓但他们管理但房间是不同的,张三只能使用自己的房间,管理员可以使用所有的房间,如果张三使用了其他人的房间就会引发问题——数据权限安全问题。

那么如何在已有的权限管理模型下对数据权限进行管理是数据安全难以避免的问题。

数据权限问题的解决

数据权限问题的来源

不属于用户拥有的一条或多条数据被非法操作。

解决方式

1、通过业务逻辑对数据所属进行验证,因为不同业务对数据安全性有不同的需求,这种是常用方式
2、通过框架验证,这种一般要提前在安全框架中设计好,通常想要设计成通用的比较难

解决方案

关键点:将数据的拥有信息(数据所属)与用户绑定,然后进行校验。
绑定需要记录用户所属信息,例如:存储数据A的owner为张三或单独为一个所属关系表;验证是查询是否为所属。

数据权限操作的数据由于业务的不同会呈现不同复杂程度(一条/多条/混合…),暂先以下修改订单记录为例子:

api/modifyOrder?orderId=123;

方案1:

在web层进行验证,获取session的用户信息与数据库的信息进比对,判断是否有权限操作,记录所属用户则允许操作。
分析:
1)针对单条件、少量记录的情况,如果是复杂的数据会牵扯更新多个表就不好判断(这种情况以一个表的记录为基准)
2)如果这个数据是共享的,这种方式查询开销会增大
3)需要查询数据库
优点: 优点实现简单;
缺点:只能针对简单数据操作权限进行管理,存在查询开销,当数据复杂查询开销进一步增大

方案2:

在修改信息时,通过sql验证是否对数据所属 where owner=zhansan,如果不符合则不会对数据进行修改,修改与否可以通过sql记录更新数据判断。

分析:
1)针对单条记录,一个表中对记录;数据不复杂对情况
2)避免了数据库查询
3)数据存在共享但情况需要做连表查询,否则就又回到了查询数据库

优点:避免了查数据库
缺点:针对单条记录,同表中但记录;共享数据记录需要做连表查询

方案3:

用户修改这个数据之前必定先查询出来,将查询数据信息(查询出认为有权限)与当前用户sessionId绑定生成token,请求时带上token,后端操作时拿当前用户sessionId与数据信息(如orderId)生成token进行比对,判断是否是同一个人操作。

api/modifyOrder?orderId=456&token=ABCSXXXXXX

案例:

用户1 orderId=123 token=ABC1(123+用户1的sessionId)
用户2 orderid=456 token=ABC2 (456+用户2的sessionId)

用户2篡改用户1订单请求情况:
1) api/modifyOrder?orderId=123&token=ABC1 // 用户1的orderId和token
2)api/modifyOrder?orderId=123&token=ABC2 // 用户1的orderId、用户2的token

后端处理情况:
1)生成token(123+用户2的sessionId)与传入token(123+用户1的sessionId)比较,不匹配拒绝
2)生成token(123+用户2的sessionId)与传入token(456+用户2的sessionId)比较,不匹配拒绝

分析:
1)使用情况:针对单条记录,或一次表单修改时
2)将数据权限和当前用户绑定并抽象出一个token

优点:避免了查询数据库或数据库计算开销(where owner=zhansan)
缺点:前期需要查询配合生成token,因此业务复杂性增加了

总结

1、数据权限操作往往和业务牵连比较大,通常在业务中判断处理
2、当数据复杂时数据权限不好控制,会伴有大量的验证操作

参考

1、https://www.cnblogs.com/hnsongbiao/p/3752617.html
2、https://www.jianshu.com/p/ed39d9bc6798
3、https://coolshell.cn/articles/19395.html

数据权限问题的几种处理和思考相关推荐

  1. 实现数据权限控制的一种方法

    在企业管理系统中,常常有这样的要求:  1. 用户一般只能查看自己部门的数据  2. 可以设置用户可以查看哪些部门的数据  这种权限的控制,一般称为数据权限,与之对应的功能权限,则是系统中哪些功能可以 ...

  2. 若依框架使用数据权限

    1.若依架构自带的数据权限为以下几种: 2.再功能模块给用户角色配置对应的数据权限如何让它生效 1)查看自己若依架构的 com.ruoyi.framework.aspectj. DataScopeAs ...

  3. ruoyi数据权限设置

    目录 数据权限 数据权限,实现指定用户可以操作指定范围的数据.例如说,针对员工信息的数据权限: 用户 数据范围 普通员工 自己 部门领导 所属部门的所有员工 HR 小姐姐 整个公司的所有员工 上述的这 ...

  4. 报表数据权限体系的搭建,报表平台权限管理

    为了数据系统安全,我们通常都希望每个用户只能看到其所属机构的数据. 比如对银行来说,希望广州分行的用户登录系统打开报表只能看到广州分行的数据,北京分行的用户登录系统只能看到北京分行的数据.下面以Sma ...

  5. 数据权限设计思路_后台权限管理设计思路:三种模型分析

    编辑导语:任何系统/产品搭建时,最先考虑的都应该是权限管理模块,而且权限管理模块的清晰.稳定是平台产品健康发展的基石,权限管理核心考虑的问题是用户与权限的关系.本文作者对三种不同权限管理的版本展开了梳 ...

  6. mybatis-plus团队新作:mybatis-mate 轻松搞定数据权限

    欢迎关注方志朋的博客,回复"666"获面试宝典 今天介绍一个 MyBatis - Plus 官方发布的神器:mybatis-mate 为 mp 企业级模块,支持分库分表,数据审计. ...

  7. Gridview数据控件的七种字段类型

    9.8  数据控件的七种字段类型(Fields Type)的应用 GridView共支持七种字段类型,字段原本应该叫"Column"比较恰当,但ASP.NET 2.0却采用另一个名 ...

  8. 信息系统开发平台OpenExpressApp - 数据权限

    功能权限一般放在一般是放在MVC的controller层,在<信息系统开发平台OpenExpressApp - 功能权限>介绍了OEA基本的功能权限,我们是通过统一配置的.作为数据应用产品 ...

  9. mysql php gpl_MySQL_MySQL数据库远程访问权限如何打开(两种方法),下载GPL版本安装MySQL Community - phpStudy...

    MySQL数据库远程访问权限如何打开(两种方法) 下载GPL版本安装 MySQL Community Edition(GPL) Community (GPL) Downloads » 在我们使用mys ...

最新文章

  1. 如何在Python中匹配最接近的字符串
  2. leetcode @38报数-js
  3. 【转】电驴提示“该内容尚未提供权利证明,无法提供下载”之解决办法详解...
  4. python吃内存还是cpu_Python2 得到 CPU 和内存信息要怎么实现呢?
  5. 使用kali的工具攻击win10_使用“媒体创建工具”制作Win10系统安装U盘
  6. BOOL 值在 debug 和 release 模式下初始化不一样!!!
  7. kvm直通sata_基于KVM的SRIOV直通配置及性能测试
  8. 怎么更新android 10.0,Android 10.0(Q OS)系统升级计划Androi
  9. Libra教程之:Libra协议的关键概念
  10. WEB入门之十九 UI
  11. 重装系统计算机无法启动,手把手教你电脑无法开机怎么重装系统
  12. android多个activity绑定一个service,8.1.2 绑定Activity和Service
  13. OpenSSL新手自学:如何生成RSA私钥并用于数字签名
  14. 主动FTP vs. 被动FTP 权威解释
  15. 天数怎么换算成月_小时天数换算(小时换算成天数怎么算)
  16. java 聊天室系统实训总结_关于JAVA聊天室编写的总结
  17. 特征选择之互信息(mutual information)算法思想及其python代码实现
  18. 所有浏览器主页都变成hao123,hao123劫持浏览器(亲测有效)
  19. mysql允许连接表为空_mysql – 选择一个表中的所有项并与另一个表连接,允许空值...
  20. 简单的python抢红包脚本-Python自动抢红包,超详细教程,再也不会错过微信红包了...

热门文章

  1. 嵌入式面试linux,嵌入式Linux面试题
  2. 第一周Web——HTML5的部分标签
  3. U盘插上可以显示HTML文件,U盘插入电脑之后出现的一个LOST.DIR文件是怎么回事?
  4. 动态给下拉框,单选框赋值,设置默认选中项的几种方法
  5. [CF_GYM102798K]Tree Tweaking
  6. Android开发之手机铃声代码实现
  7. 比喝水都多!美国人咖啡消费量飙升至20年来最高水平 | 美通社头条
  8. 戴尔t630服务器系统,远比你想象的强大 塔式服务器也玩GPU
  9. RuntimeError: expected scalar type Long but found Int
  10. 传奇手游三职业1.80合击服务端三端互通版搭建教程