【发布时间】:2016-03-03 07:54:27
【问题描述】:
在大多数情况下,您只希望用户能够访问由用户自己创建的数据库中的实体。例如,如果有一个由 User1 创建的日历,那么只有 User1 应该能够读取、更新或删除这个特定的日历及其在数据库中的内容。这通常与授权无关 - 在我的项目中,已经有一个基于角色的授权组件,它检查用户是否属于“日历编辑器”角色,但它不检查是否允许特定用户访问特定的日历。
因此,最终必须在当前请求的用户 ID 和代表所请求日历所有者的用户 ID 之间进行比较。但我想知道在哪里做这个。我的想法:
-
我可以在 DAO 级别上做到这一点。但是每个 DAO 方法都需要一个额外的参数来表示用户 ID,这使得这些方法更加冗长并降低了可重用性。
例如
def findCalById(id: Int): Future[Option[Calendar]]变成
def findCalById(id: Int, ownerId: Int ): Future[Option[Calendar]]一个优点是权限检查基本上是在查询级别完成的,这意味着如果用户无权访问日历,则不会从数据库返回日历。但话又说回来:如果在某些情况下没有返回日历,您如何区分不存在的日历和当前用户无法访问的现有日历?两种不同的场景,产生相同的结果。
-
另一种选择可能是将 DAO 排除在外,并在服务层或类似的东西中进行检查。这意味着检查是在 DAO 返回请求的日历之后执行的。这种方法听起来比另一种更灵活,但这也意味着,如果用户无法访问请求的日历,则请求的日历仍然会消耗带宽和内存,因为它是从数据库中获取的。
也许还有我什至没有考虑过的其他选项。有什么最佳做法吗?
顺便说一句:我的 Web 应用程序中没有日历,这只是说明问题的一个示例。
【问题讨论】:
标签: database scala model-view-controller web-applications playframework