【发布时间】:2016-04-27 17:00:44
【问题描述】:
在我用 javascript (Node.js) 编写的 DDD 应用程序中,我在授权通用子域的实现上遇到了困难。我检查了 RBAC / ACL 授权模型如何实现这一点,但它们似乎没有我需要的每个实例的权限。
据我了解,RBAC 具有基于角色的授权。用户被分配到角色。角色是分层的并继承权限。角色可以拥有多个权限。权限允许对资源执行命令。
但是,根据 RBAC 的定义,资源是通用的,如“帖子”、“评论”、“书”等。它们不是特定于实例的(如帖子(id:9283984))。例如,不可能在 RBAC 中定义只有创建帖子的用户才能编辑它。在给定的“帖子(id:2398493)”上将角色“管理员”分配给“用户(id:(8290321)”似乎是不可能的
定义有权执行修改其他人在特定资源上的角色的命令的角色变得更加复杂。
我的申请要求是:
发出CreateLedger 命令的User 被自动分配为此Ledger 的Admin。他只能将其他人分配为他是@987654328@ 的Ledgers 的Managers 或Collaborators 或Viewers。他也可以撤销这些角色。允许Managers 管理Ledger 的Accounts。 Collaborators 可以在这个Ledger 上编辑Transactions,而Viewers 只能查看数据(只读)。一个Admin 可以将Admin 角色分配给他是Admin 的另一本书User。
我最初的想法是,为了让用户能够管理用户在资源上的角色,需要有一个映射
user(id:X) -> role(name:Z) -> permissions -> resource(id:Y) -> commands
但在 RBAC 中只能分配
user(id:X) -> role(name:Z) -> permissions -> resource(name:"Ledger") -> commands
然后,为了克服 RBAC 的这个限制,我想到了用它们的 id 来命名资源,比如
user(id:X) -> role(name:Z) -> permissions -> resource(name:"Ledger:39823847") -> commands
但这似乎是错误的。我还没有看到任何使用资源名称作为实际实例映射的 RBAC 示例。
我用错了锤子?我看错了吗?是否有其他更适合此任务的访问控制模型?或者这是要走的路?如果有人能指出我正确的方向,我将不胜感激。
感谢您的帮助
【问题讨论】:
标签: authorization domain-driven-design access-control rbac