【问题标题】:ACL best practices, store roles in user object, or separate table/collection?ACL 最佳实践,在用户对象中存储角色,还是单独的表/集合?
【发布时间】:2012-12-27 02:05:52
【问题描述】:

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

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

顺便说一句,我目前正在使用 Mongodb。但是,我尚未研究使用关系数据库与非关系数据库进行身份验证的优缺点,所以如果您的答案取决于此,请告诉我。

在我打字的时候,我想到了一件事。如果我将角色存储在单独的集合中,它会更便携。我将能够更轻松地更换 acl 系统。 (我想?)

【问题讨论】:

    标签: node.js mongodb acl


    【解决方案1】:

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

    非关系

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

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

    关系

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

    总结

    如果您的应用程序的其余部分存储在 Mongo 中并且 必须 保留在那里(出于性能或任何限制),那么您最好在 Mongo 中完成所有这些。我遇到的大多数建议都说不要混合和匹配数据存储,例如使用其中一种,但不能同时使用。话虽这么说,我已经完成了两者的项目,它可能会变得混乱,但有时利大于弊。

    【讨论】:

    • 我很想知道总结的其余部分! :)
    • 哈哈谢谢。一定是失去了注意力,没有意识到。当我说话的时候,我也倾向于那样落后;)
    • @DavidWelch,一般来说你说的有道理,但有时关系“风格”在 NoSQL 的上下文中是有道理的。例如,如果我在 Mongo(或 Couch 或其他)中,并且我有这些不经常更新的大型用户对象,但角色经常更新,该怎么办。即使在 NoSQL 中,为角色设置一个单独的集合是否有意义,这样您就可以原子地访问它们,而无需不断更新用户?
    • @deitch 迟到总比不回复好,对吧? ;) 你肯定有一个很好的观点,并且在那里有一个论点。但是,我使用的大多数 NoSQL 解决方案都具有非常高性能的写入操作,因此向角色发出写入并不昂贵(假设您已经知道要更新哪个文档)
    • 嗨@DavidWelch,当然!有趣的是,您所说的显示了我对写入方式的假设。也许我需要质疑我的假设。
    【解决方案2】:

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

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

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

    一般说明:

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

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 2016-11-16
      相关资源
      最近更新 更多