【发布时间】:2016-04-26 20:12:58
【问题描述】:
我看到的大多数示例都实现了 REST URL 模式,例如 http://www.app.com/books/1 以访问 ID 为 1 的书籍或 http://www.app.com/books 以访问所有书籍。
这很好,但我通常处理支持多家公司的应用程序。例如,ABC 公司有 2 个用户,DEF 公司有 2 个用户。 ABC 公司的用户创建了一本 id 为 100 的书。现在,当 DEF 公司的用户打入 RESTful 呼叫时:
http://www.app.com/books/100
需要有一个访问异常,或者
http://www.app.com/books
只会列出属于 DEF 的所有书籍(而不是 id 为 100 的新书籍)。对于许多实体,如 Book,公司 ID 是表的一部分,但对于其他实体可能不是这样。例如,如果有一本书的某一章有一个 REST 操作,http://www.app.com/chapter/333 章表将有一个外键引用该书而不是该公司。
管理对该资源的访问权限的最佳做法是什么?如果 DEF 中的某个人试图访问 ABC 中的某个章节,我将不得不构造一个查询以将该章节加入该书以验证公司 ID 是否有效。
我正在使用 Grails 3.x,其中大部分逻辑都是抽象的,并且认为是“自动”发生的。因此,会自动返回针对特定图书 ID 的 URL,列出所有图书的请求会返回数据库中的每本书。似乎要继续,我将不得不覆盖大部分自动功能并实现我自己的安全性,也许在服务层中,公司 ID 将是每个操作的必需参数。这听起来合理吗?
这种事情有既定的最佳实践吗?
【问题讨论】:
-
在大多数情况下,我们根据用户在服务器端的登录信息(使用 SpringSecurityPlugin)为查询添加安全性(客户端甚至不知道它是查询的一部分)。简单地说,只要我们想要 list(),我们就会使用 findByCompany() 和 findByIdAndCompany,或者在所有 REST 请求的搜索中添加 Company 作为条件。 Book 域的一部分将是创建它/具有访问权限的公司(或一组公司)。
-
完全正确 - 使用 SpringSecurity 通过请求标头中的令牌对每个请求进行身份验证。之后,您可以实现任何您想要的逻辑,并且您的应用程序将知道哪家公司正在请求数据。检查:org.grails.plugins:spring-security-core 和 org.grails.plugins:spring-security-rest