【问题标题】:How do I minimize round-trips to SQL with user-based authorization?如何使用基于用户的授权最大限度地减少到 SQL 的往返行程?
【发布时间】:2013-07-24 00:01:49
【问题描述】:

上下文:由 SQL DB 支持的 MVC Web 服务。假设我的数据库中有一个用户关系,以及一组通过 FK 链引用它的关系。例如,假设我有一张桌子:

sales_people
car_dealership
cars

销售人员属于某个汽车经销商,汽车也是如此。销售人员应该只能看到属于他们特定经销商的汽车。我在这里有几个选择:

我可以将授权业务逻辑烘焙到 SQL 查询本身中:

SELECT *
FROM cars as c, sales_people AS sp, car_dealerships AS cd
WHERE where c.dealership_id = cd.id
AND sp.dealership_id = cd.id
AND sp.id = ?
AND c.id = ?

假设调用者已验证 sales_people id 是合法的,并且防止了对该 id 的简单欺骗,那么上面的查询将防止用户获得不属于他的汽车。只要连接不是太大,这可能会扩展到任意数量的表。

上涨?一个数据库调用。

缺点?

  • 这里的授权业务逻辑非常基础。这些表之一引用的用户?当然,你可以通过。但是,假设我必须有更复杂的访问规则。很可能它们根本无法通过一个简单的查询来实现。
  • 很难判断用户是否请求了未经授权的行,或者该行是否已获得授权但实际上并不存在,这使得错误报告变得棘手。您不知道应该报告 200 还是 403(尽管取决于 API 的类型,在这些情况下您可能希望始终使用 200 以防止将过多信息暴露给攻击者)。

我看到的另一个选项是在事实之前或之后进行额外查询,以验证该用户确实可以访问数据。例如。获取销售人员有权获取的汽车 ID 列表,然后对该子集执行查询,或者完全相反。

明显的好处是我可以在业务层进行更多调用并运行更多逻辑,并且可以按照自己的意愿进行操作。

缺点是我会产生更多的数据库流量,这可能会破坏交易,具体取决于发出请求的频率。

我可能在这里遗漏了一些其他选项,我很想听听您之前是如何解决这个问题的。有没有更好的方法?

【问题讨论】:

  • MVC(网络服务?其他?)和数据库之间的延迟是什么?也就是说,是 HTTPSVC 还是 SVCDB 的问题?如果是 HTTPSVC,我建议专注于使用分层模型的特定于域的查询和响应。如果 SVCDB 链接良好,那么如何生成它可能变得“不那么重要”。
  • 我不熟悉分层模型响应的概念。你能澄清一下吗?
  • 关于另一点,此时我并不担心 HTTPSVC 部分,因为我将大部分工作都集中在 Web 服务级别,因此来自浏览器的往返to api 已经是最低限度了。

标签: sql postgresql model-view-controller authorization role-base-authorization


【解决方案1】:

我认为作为一般规则,您应该使代码的行为符合逻辑,然后以其他方式扩展性能,例如更大更强大的数据库或缓存结果。

对于我的应用程序,我使用多个查询。我已经为我们的系统计时,5-10 次往返时间不到 1 毫秒。这对我来说已经足够了。我见过其他人创建复杂的存储过程来做他们想做的一切。结果是他们可以从数据库中返回 403 或 404 之类的内容。

我个人更愿意多次访问数据库,以使代码更简洁、更易于阅读。如果您的负载不太大,则尤其如此。硬件很便宜,但你的时间不是。

【讨论】:

    【解决方案2】:

    我想在调试更多这些问题后添加另一个意见。

    很高兴告诉用户(或应用程序代码)究竟出了什么问题。我现在常用的方法是从 SQL 返回所有相关的安全信息,然后在应用程序中进行检查。这样,就可以往返数据库一次,您可以从代码中提供非常详细的信息,例如“您不再有权访问该经销商。”或“这辆车已被删除。”。

    【讨论】:

      猜你喜欢
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      相关资源
      最近更新 更多