一、前言
在大多数系统中,权限的设计是必不可少的。 权限设计=功能权限数据权限。 此外,功能权限在业界通常是一套基于角色访问控制(RBAC )的方案。 数据权限的权限因业务场景而异,需要根据具体场景巧妙设计。 且必须在项目开始时设计,而不像功能权限那样在项目结束时添加。
注:更详细地说,还可以添加字段权限
1.1权限类型
【功能权限】:增加产品等,能做什么的问题。
【数据权限】:查看本人所有订单等,可以看到哪些数据的问题。
【现场权限】:看不到供应商帐户、角色、部门等信息等,会出现什么样的信息的问题。
二.数据权限设计
2.1应用场景
订单本人可以看到
销售票可以由本人或上级领导查看
销售表,销售人员可以看到自己的。 销售经理只看销售额超过100,000的东西。
2.2数据权限设计分析
数据权限与功能权限非常不同,粒度非常小。 在整个项目开发周期中,不能像功能权限那样在项目结束时添加。 数据权限必须已经在项目设计阶段计划好,而不是在组件级。 以前在网上看到同一个人想根据SPRING切片的原理实现数据权限,可以实现低入侵、低耦合,所以想法非常好。 但是,现实非常辛苦。 这样一来,整个APP应用系统的效率大幅降低,数据权限的相同控制策略也非常不灵活
2.3 SQL语句的可扩展性、数据权限设计分析
数据权限通常用作功能权限的高级行为。 可以从数据对象的宽度方面进行控制。 例如,用户只能看到自己的订单,普通会员不能看到某个数据对象的高级属性(字段)等。 粒度如此细时,显然无法处理结果集。 此时,您只能介入SQL语句。 此时,在开发阶段不太想让开发者考虑数据权限的问题。 此时,必须将SQL与数据权限策略分开。 调用接口时,进行数据权限接口的连接。 这样也做了代码的低入侵。
2.4 SQL语句的高效解析处理
权限模块的核心之一是SQL语句的有效解决处理。 SQL处理是指根据当前登录者信息和数据权限策略生成具有数据权限处理结果的SQL语句。 因此,这里要求SQL语句的分析处理准确、准确。 在开发阶段,开发者将SQL写入配置文件,在执行阶段,通过数据权限获取该SQL并进行分析处理(添加数据权限),从而完成SQL的组装处理。
2.5数据权限策略设计
最中心的是数据权限策略的设计。 这里先引入几个概念。
资源:数据权限的控制对象、业务系统内的各种资源。 例如,订单发票、销售票等
主体:用户、部门、角色等
条件规则:检索数据的条件定义
数据规则:【数据权限】的条件规则
简单示例:包含资源、主体和规则。
正在应用规则:销售员只能看到自己的销售订单。
2.6考虑两个问题:
第一,如何配置
第二种方法是将sql语句连接起来
2.6.1应用实例
订单本人可以看到
销售票可以由本人或上级领导查看
销售表,销售人员可以看到自己的。 销售经理只看销售额超过100,000的东西。
可以考虑直接的方法,在访问数据的入口加入sql Where条件来实现,组织SQL语句
where UserID={CurrentUserID}
where userid={ current userid } or { current userid } in )读取器
where userid={ current userid } or (() ) ) ) ) )。
这一个个的条件,可以简单地理解为一个个【数据规则】。
如果说每个人应该对应不同的规则,也可以认为一个用户对应不同的角色,每个角色有不同的【数据规则】,设计就是
【资源】-【主体】-【数据规则】
根据提供者的不同,准备不同的权限应对策略。
2.6.2资源-规则
使用JSON格式应用资源和规则。
{
‘ rules’: [{
‘ field ‘ : ‘客户id ‘,
‘ op’: ‘like ‘,
‘ value’: ‘AN ‘,
‘ type’: ‘string ‘
()、
‘ op’: ‘and ‘
}
以上面的格式考虑安全性时,是不够的。 建议采用以下方法:
{
‘ rules’: [{
‘ field’: ‘OrderDate ‘,
‘ op’: ‘less ‘,
‘ value’: ‘2012-01-01 ‘
(,
{
‘ field ‘ : ‘客户id ‘,
‘ op’: ‘equal ‘,
‘ value’: ‘VINET ‘
}
]、
‘ op’: ‘and ‘
}
(筛选规则分为“分组”、“规则”(字段、值、操作符)和“操作符”(and or )三个部分,它们本身被分组。 )
规则说明:
查找所有客户VINET订单时间小于2011-01-01的文档
这种数据安全且通用(也可以添加另一个OR子查询)。 无论是前端还是后端,无论使用的是什么组件,都可以很好地利用。
后台翻译可以生成这种SQL的参数。
Text:
([ orderdate ] @ p1and [ customerid ]=@ p2 )
Parameters:
p1:2012-01-01
p2:VINET
2.6字段权限
如果数据权限是功能权限的纵向扩展,则字段权限是横向扩展。 可以禁止用户/角色访问特定字段
一分快三技巧规则】
根据提供者的不同,准备不同的权限应对策略。
2.6.2资源-规则
使用JSON格式应用资源和规则。
{
‘ rules’: [{
‘ field ‘ : ‘客户id ‘,
‘ op’: ‘like ‘,
‘ value’: ‘AN ‘,
‘ type’: ‘string ‘
()、
‘ op’: ‘and ‘
}
以上面的格式考虑安全性时,是不够的。 建议采用以下方法:
{
‘ rules’: [{
‘ field’: ‘OrderDate ‘,
‘ op’: ‘less ‘,
‘ value’: ‘2012-01-01 ‘
(,
{
‘ field ‘ : ‘客户id ‘,
‘ op’: ‘equal ‘,
‘ value’: ‘VINET ‘
}
]、
‘ op’: ‘and ‘
}
(筛选规则分为“分组”、“规则”(字段、值、操作符)和“操作符”(and or )三个部分,它们本身被分组。 )
规则说明:
查找所有客户VINET订单时间小于2011-01-01的文档
这种数据安全且通用(也可以添加另一个OR子查询)。 无论是前端还是后端,无论使用的是什么组件,都可以很好地利用。
后台翻译可以生成这种SQL的参数。
Text:
([ orderdate ] @ p1and [ customerid ]=@ p2 )
Parameters:
p1:2012-01-01
p2:VINET
2.6字段权限
如果数据权限是功能权限的纵向扩展,则字段权限是横向扩展。 可以禁止用户/角色访问特定字段