我看到的大多数示例都实现了REST URL模式,例如http://www.app.com/books/1
来访问ID为1的书,或者http://www.app.com/books
来访问所有书。
很好,但是通常我会开发支持多个公司的应用程序。例如,公司ABC有2个用户,公司DEF有2个用户。公司 ABC 的用户创建了ID为100 的图书。现在,当来自 DEF 公司的用户打来RESTful call 时: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是每个操作的必需参数。听起来合理吗?
是否存在针对此类事情的既定最佳实践?
最佳答案
不知道它是否适合您的需求,但是有趣的是,有一个Burt Beckwith编写的ACL插件:
Spring Security ACL Plugin
关于rest - 具有多个公司或组织的系统的REST API设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36830050/