【问题标题】:Best way to provide access control on datastore entities with parent relationship对具有父关系的数据存储实体提供访问控制的最佳方式
【发布时间】:2016-10-03 06:47:32
【问题描述】:

假设我有三种实体——用户、帖子、评论。 每个帖子都有一个父用户,每个评论都有一个父帖子,即 用户->发布->评论。

我的 API 如下所示:

这里的key是实体的websafe key

GET /user/{key} - 获取用户信息

POST /user/{key}/post/ - 创建帖子

GET /post/{key} - 获取帖子

POST /post/{key}/comment/ - 创建评论

GET /comment/{key}

问题:

  1. 这里的问题是,如果 user1 知道 user2 的密钥,那么 user1 可以 访问 user2 的数据。
  2. 我阅读了有关数据存储中的多租户的信息,但对它是否 是否适合这种类型的数据存储设计。因为我有 超过 100 个用户,并且可能会增加。
  3. 我需要手动处理吗?如果是,那将是什么 最好的方法?

【问题讨论】:

    标签: android google-app-engine google-cloud-datastore objectify


    【解决方案1】:

    这是一个很好的、宁静的 API 设计(尽管流行的惯例是使集合多元化 - /users/{key}/posts/{key}/comments 等)。

    您应该明确地处理授权检查。 GET /users/{key} 的实现应该检查调用者是否有权查看该对象并返回 HTTP 401 或 403。推测调用者是由某种身份验证标头确定的。

    您可能正在考虑使用GET /myuserGET /myposts 之类的替代方案。有时这可能很有用,但如果可能的话,最好避免这种事情——它违反了 REST 的精神和 GET 的缓存能力。此外,最好的 URL 不仅适用于特定用户,而且还允许任何超级用户代表用户执行相同的操作。这些 URL 需要对显式对象起作用。

    回复:多租户。我强烈建议避免它。我认为它不是特别有用,如果您是 GAE 新手,它会特别令人困惑。只需对您需要的数据进行建模 - 如果帖子与用户相关联,则将该信息存储在帖子中并使用它来执行授权检查或过滤。

    【讨论】:

    • 感谢您回复@stickfigure。你能告诉我避免多租户的原因是什么吗?什么时候应该使用多租户?
    猜你喜欢
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多