【发布时间】: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