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

时间:2013-01-12 17:38:15

标签: node.js mongodb acl

我正在使用nodejs,并且过去一周一直在研究acl /授权。我发现只有一对,但似乎没有一个我需要的功能。最接近的是https://github.com/OptimalBits/node_acl,但我不认为它支持通过id保护资源(例如,如果我想允许用户12345并且只允许用户12345访问用户/ 12345 / edit)。因此,我想我必须为自己制作一个自定义的acl解决方案。

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

顺便说一句,我现在正在使用Mongodb。但是我还没有研究使用关系数据库与非关系数据库进行身份验证的优缺点,所以如果你的答案取决于那个,请告诉我。

当我打字时,我想到了一件事。如果我将角色存储在单独的集合中,则它更具可移植性。我可以更容易地换掉acl系统。 (我想?)

2 个答案:

答案 0 :(得分:10)

这里的问题似乎可以从“我应该在哪里存储我的角色”中抽象出“我应该如何在Mongo(或一般NoSQL)中存储相关信息”。这是一个关系与非关系建模问题。

<强>非关系

使用Node + Mongo,将角色存储在用户上可以很容易地确定用户是否可以访问该功能,因为您可以查看“角色”属性。权衡的是你有很多重复的信息('user_read'可能是每个用户帐户的角色),如果你最终更改了该属性,你需要在每个用户对象。

您可以将角色存储在自己的集合中,然后将该条目的ID存储在User模型的Roles集合中,但是您仍然需要从集合中获取实际记录以显示其中的任何信息(虽然可能这种情况很少见)

<强>关系

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

摘要

如果你的应用程序的其余部分存储在Mongo中并且留在那里(为了性能或任何约束),那么你最好在Mongo中完成所有操作。我遇到的大多数建议都说不要混合使用。匹配数据存储,例如使用一个或另一个,但不是两个。话虽这么说,我已经完成了两个项目,它可能会变得混乱,但有时候专业人士会超过缺点。

答案 1 :(得分:3)

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

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

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

一般说明:

  • 您可以添加角色/权限,例如&#39; blog \ 123&#39;在acl。您还可以根据诸如put,delete,get等动词为用户授予权限。
  • 我认为创建一个不依赖于您的存储实现的可插拔解决方案更容易。也许这就是为什么acl不会在你拥有的相同集合中存储角色的原因。
  • 如果您选择将角色保留在自己的集合中,请考虑将其添加到令牌(JWT)。这样,您就不必为每个需要授权的请求检查您的收藏。

我希望有所帮助。