ACL最佳实践,将angular色存储在用户对象中,还是单独的表/集合?

我正在使用nodejs,并且一直在研究过去一周的acl / authorization。 我只find了一对夫妇,但都没有看到我需要的所有function。 最近的是https://github.com/OptimalBits/node_acl ,但我不认为它支持通过id保护资源(例如,如果我想允许用户12345和只有用户12345访问用户/ 12345 /编辑)。 因此,我想我将不得不为自己制定一个自定义的acl解决scheme。

我的问题是,在每个用户对象下存储angular色(用户,pipe理员,主持人等)有什么优点和缺点,而不是创build另一个集合/表来映射每个用户的授权规则? node_acl使用单独的集合,而其他大多数依赖于用户对象中的roles数组。

顺便说一下,我现在正在使用Mongodb。 不过,我还没有研究使用关系数据库和非关系数据库进行身份validation的利弊,所以如果让我知道你的答案是否依赖于这个数据库。

当我打字的时候,我想到了一件事。 如果我将angular色存储在单独的集合中,则它更便于携带。 我将能够更容易地更换acl系统。 (我认为?)

这里的问题似乎可以从“我应该在哪里存储我的angular色”到“我应该如何在Mongo(或者一般的NoSQL)中存储相关信息”这个抽象概念。 这是一个关系vs非关系build模问题。

非关系

使用Node + Mongo,将angular色存储在用户上将使得确定用户是否有权访问该function非常容易,因为您只需查看“angular色”属性即可。 权衡是你有很多重复的信息('user_read'可能是每个用户帐户上的一个angular色),如果你最终改变了这个属性,你需要在每个用户对象内更新它。

您可以将angular色存储在自己的集合中,然后将该条目的ID存储在用户模型的Roles集合中,但是您仍然需要从集合中获取实际logging以显示其中的任何信息(尽pipe可以说这可能是一种罕见的情况)

相关的

将这些存储在关系数据库中将是一个更“传统”的方法,因为您可以build立表之间的关系(通过FKs /连接表或不是)。 这可能是一个很好的解决scheme,但是不再有使用NoSQL数据库的好处。

概要

如果你的应用程序的其余部分存储在Mongo中, 并且必须待在那里(对于性能或任何约束),那么你可能最好在Mongo中完成这一切。 我所遇到的大部分build议都是说不要混合和匹配数据存储,例如使用一个或另一个,而不是两个。 这就是说,我已经完成了两个项目,它可以变得混乱,但有时候,利弊大于弊。

我喜欢@DavidWelch的答案,但我想从另一个angular度来解决这个问题,因为上面提到的库提供了完全使用不同数据存储的选项。

将angular色存储在单独的数据存储中:

  • (Pro)如果使用更快的数据存储,可以使系统更高性能。 (在分布式环境中更有优势?)
  • (Con)您必须确保两个数据存储之间的一致性。

一般注意事项:

  • 您可以在acl中添加诸如“blog \ 123”之类的angular色/权限。 你也可以给用户基于诸如put,delete,get等动词的权限。
  • 我认为创build一个不依赖于存储实现的可插拔解决scheme会更容易。 也许这就是为什么acl不会将angular色存储在相同的集合中。
  • 如果您select将angular色保留在自己的集合中,请考虑将其添加到令牌(JWT)。 这样,您就不必检查每个需要授权的请求。

我希望有所帮助。