诚心请教: 如何优雅的实现对数据的权限控制?

2020-09-12 11:28:19 +08:00
 igeeky

我实现了一个RBAC的权限系统. 它能很好的对 api 接口的权限进行控制. 具体功能及实现请参考这里: https://github.com/iGeeky/wolf/blob/master/README-CN.md

我现在想添加数据的权限控制, 如下下面一个例子:

目前的 RBAC 只能实现, 如果给了用户 A查询及审核视频的权限, 也就对所有视频都有了相应权限.

我考察了一下, 感觉使用ABAC实现对数据的访问控制, 可能是一个比较常用的方法, 比如上面的例子中, 可以定义这样的策略:

测试数据:

用户: {用户名: 用户 A, 角色: 短视频审核员, 部门: 运营 1 组, ...}
视频: {标题: 短视频, TAG: 短视频, ...}

策略(这里不是严格按照 ABAC 或 RBAC 的架构及概念来描述的):

用户: 用户.角色 = 短视频审核员
资源: 视频
动作: 读取,审核
匹配策略: 视频.TAG = 短视频

如果在业务系统内实现上面的逻辑, 应该是比较好实现这样一套控制策略的. wolf 的架构是与业务系统完全解耦的, 它是在 http 代理层实现的. 因此在目前 wolf 中实现却有一些难题:

对于以上问题, 大家有什么好的解决方案没?

7118 次点击
所在节点    程序员
33 条回复
workwonder
2020-09-12 11:46:01 +08:00
ABAC - 基于属性的权限控制,说白了就是在应用内部适当的地方做权限判别。
个人觉得在代理层(网关)做权限控制很难保证灵活性。
igeeky
2020-09-12 11:48:32 +08:00
@workwonder 嗯,难点就是在这儿. 我想实现一个通用的权限系统. 如果与应用进行了过多的耦合, 就缺少通用性.
workwonder
2020-09-12 11:48:33 +08:00
37Y37
2020-09-12 11:49:08 +08:00
这个就是对象权限控制,给对象赋权,django 的 guradian 实现的就挺好,可以看看
workwonder
2020-09-12 11:53:09 +08:00
@37Y37 只能查询指定分类的视频,看起来是“集合”权限,想知道 guradian 能不能帮忙?
securityCoding
2020-09-12 12:03:31 +08:00
没有什么好的办法,只能传入标识在业务内部来做
workwonder
2020-09-12 12:08:14 +08:00
@securityCoding 我也觉得如果权限控制上升到“策略”级别,那么只有走到应用内部才方便收集完整的上下文数据。
dk7952638
2020-09-12 13:01:07 +08:00
数据权限我还真的做过很多的尝试,说几点谈不上经验的经验吧
1,数据权限控制设计不宜过于灵活,过于灵活的数据权限只会变成运维和性能的负担,不如直接去业务里实现
2,通过大量的实践,基于组织架构的数据权限控制是最合理与通用的,也是最贴合实际场景的
3,数据的过滤最好直接基于 SQL 进行,这样可以避免持久层框架的技术绑定
最后我们目前使用的是基于 Druid 框架 AST 解析的动态数据过滤,通过读取用户的数据权限,自动把数据权限相关的条件注入到 SQL 中
igeeky
2020-09-12 13:04:51 +08:00
@securityCoding 嗯, 这是一种可行的办法. 像上面的例子中, 可以把上面的匹配策略条目,通过请求头传到业务后端: X-Policy: 视频.TAG = 短视频. 业务端需要根据该策略表达式,进行查询及更新的过滤.
retanoj
2020-09-12 13:05:01 +08:00
我瞎说一个:可以 aop 来做么?
Hackerchai
2020-09-12 13:08:17 +08:00
可以试试 Casbin,各种语言都有支持,可以看一下[官网]( https://casbin.org)
igeeky
2020-09-12 13:09:11 +08:00
@dk7952638 嗯, 感谢分享. 基于 SQL 是什么意思? 是在应用层配置配置成 SQL 片段吗? 比如上面的示例配置成: video.tag = 'short_video' ?
Druid 可能在我这儿用不上. wolf 是在网关层面实现的. 与语言跟框架无关.
Hackerchai
2020-09-12 13:09:29 +08:00
[Rust][权限控制][Casbin] Rust 下成熟好用的权限控制库
https://www.v2ex.com/t/703209
可以参考我另一篇帖子的介绍
Hackerchai
2020-09-12 13:13:50 +08:00
Casbin 支持 ACL, RBAC, ABAC 等常用的访问控制模型,同时也支持分组
igeeky
2020-09-12 13:17:15 +08:00
@Hackerchai 嗯, 这个项目不错, 我云学习一下.
dk7952638
2020-09-12 13:19:00 +08:00
如果是网关的和可能确实和我说的不是一个思路的,但是我觉得网关做数据权限过滤有点不太合适,比如说有 100 个视频,属于用户 A 的有 10 个,通过你的网关进行过滤,每次请求取十个视频,如果正巧前十个都是不属于 A 的,那么可能你最后只会返回一个空数据集,这明显和用户查询属于自己的前 10 个视频的期望不符
Firewine
2020-09-12 13:21:01 +08:00
api 控制权限?
Hackerchai
2020-09-12 13:22:16 +08:00
@igeeky 如果遇到问题可以去 q qun/gitter/forum,社区开发者可以提供技术支持
igeeky
2020-09-12 13:29:35 +08:00
@dk7952638 是存在这个问题,而且返回的数据还不一定包含策略里面的所有属性,那么做策略判断也是个难题.
igeeky
2020-09-12 13:30:35 +08:00
@Firewine 目前实现了 API 的权限控制, 希望实现 API 里面的数据的权限控制.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/706344

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX