EDA365电子论坛网

标题: 平台化服务的基石(二):权限模型设计 [打印本页]

作者: Uifhjvv    时间: 2020-6-9 14:09
标题: 平台化服务的基石(二):权限模型设计
本帖最后由 Uifhjvv 于 2020-6-9 15:18 编辑 8 d% ~( N8 T5 {% v5 g3 |

: r; R8 x! n9 Z) A0 L2 F2 @接口权限控制
需要对一些服务接口做相应的权限控制,不同用户有不同的操作权限。
- M+ L% T. u3 t
[attach]273123[/attach]

% x# r8 _  o; E8 o% F
如上图,我们实现了一个最简单的基于RBAC的权限模型。在RBAC模型基础上添加了对租户、应用的支持,不同租户及应用都可以有独立的角色及资源数据。
数据权限控制
需要在数据维度上做权限控制,比如A用户只能查看自己组织的数据,再比如项目经理可以查看公司所有项目概览并管理自己所属产品线项目的信息。
为支持数据级权限控制我们对模型做了比较大的调整,引入了群组(Group)及角色定义(RoleDef),并对角色(Role)及权限(Permission)模型做了调整:
我对上文需求做扩展:
那么对应的数据大概是:

- g/ a4 K5 P# H/ K: E: f5 N8 m
这里要注意,我们定义了三个角色:
最后我们看下角色对应的权限:
Rest与统一资源定位
要受权限管理的资源有API、菜单、页面元素、数据记录等,如何统一管理?
+ X9 i2 O5 a2 Y9 t4 O9 A

# F) K3 j' k) \* `+ M! J
, |- a/ p1 I$ k" `" Q7 Z
我们在资源(Resource)模型中添加了统一定位(uri)字段,在权限(Permission)模型中添加了操作方法(operation)。
传统的方式可以为不同的资源类型建不同的表,但本文更倾向于使用统一资源定位(URI)来表示。格式如下:
<kind>://<appId>.<tenantId>/<path>?<property>=<property value>API资源:    kind = api    path = API路径菜单资源:    kind = menu    path = 菜单树节点Id页面元素资源:    kind = element    path = 页面路径/元素Id    或 path = 页面路径?<属性名>=<属性值>数据资源:    kind = data    path = 数据库类型/库名/表名/fields/字段名    或 path = 数据库类型/库名/表名/rows/{主键值}    或 path = 数据库类型/库名/表名/rows?<字段名>=<字段值>
3 l# ^/ V; V8 }
例如:
// 租户T1下应用A1的API “/user/{userId}” 资源api://a1.t1/user/{userId}// 租户T1下的API “/user/{userId}” 资源api://t1/user/{userId}// …菜单 “用户管理(userMgr)/批量导入(batchImport)” 资源menu://…/userMgr/batchImport// … “用户管理页面(userMgr)的删除按钮(id  = 'userDelete')” 资源element://…/userMgr/userDelete// … “用户管理页面(userMgr)的删除按钮(class = 'userDelete')” 资源element://…/userMgr?class=userDelete// … “mysql下xx库user表idcard字段” 资源data://…/mysql/xx/user/fields/idcard// … “mysql下xx库user表主键为100” 资源data://…/mysql/xx/user/rows/100// … “mysql下xx库user表身份证为331xxx” 资源data://…/mysql/xx/user/rows?idcard=331xxx9 n0 p8 L! A1 x9 s
有了URI后我们可以精确地定位需要的资源,接下就是操作(operation)了,这时我们发现可以引用Rest的方式实现对资源的精确操作。
回顾下HTTP的常见方法:
我们可以发现这种CRUD方法天然地支持我们对资源的各类操作。
Tip:HTTP是REST的一个主要表现协议,但REST本身是协议无关的,也更没有规定HTTP方法与资源操作的映射关系,所以严格意义上我们要明确两者的关系,但在实际项目及开发中可近似地认为REST就是用于HTTP的。详见笔者的 《微服务架构设计》
应用鉴权
上文都是针对用户的权限控制,但有需求需要实现针对应用的权限控制,如应用A提供的API除了要限制用户的访问外还要限制应用的访问。
1 f3 I" {; o2 P% @

4 R" }% v. L5 M- l( U
由于应用与用户不同,它不需要群组、角色定义,所以我们添加了应用权限(AppPermission)模型,让应用权限模型直接与资源及应用关联,实现一个简单的ACL模型。
小结
本文我们简单地介绍了用户权限中心的权限模型设计,与前文用户认证模型一样都是基于租户隔离策略,但现实情况下存在需要跨租户访问的场景,那么在用户认证和权限上我们又需要做什么处理呢?在下一篇文章中我们会就此展开讨论。

2 ]+ ~  R4 o8 l! B7 p$ B7 E! y& o

平台化服务的基石(二):权限模型设计7.jpg (30.93 KB, 下载次数: 1)

平台化服务的基石(二):权限模型设计7.jpg

作者: nkkopd    时间: 2020-6-9 15:21
需要对一些服务接口做相应的权限控制,不同用户有不同的操作权限




欢迎光临 EDA365电子论坛网 (https://www.eda365.com/) Powered by Discuz! X3.2