具有多租户和共享资源的 RESTful API

Posted

技术标签:

【中文标题】具有多租户和共享资源的 RESTful API【英文标题】:RESTful API with multitenancy and shared resources 【发布时间】:2015-03-02 09:19:58 【问题描述】:

我正在尝试为具有多租户支持和共享资源的应用程序找出“正确”的 url 结构实现。

资源:用户、项目

网址架构是

host/api/tenant_id/resource[/id][/subresource][/id]

用户 A (width id = 1) 获得了他的项目集合

GET http://example.com/api/1/projects/

用户 A 创建一个新项目,可供用户阅读

GET http://example.com/api/1/projects/2

现在用户 A 向另一个用户 B (id = 2) 授予对项目 2 的访问权限。 用户 B 希望通过以下方式查看与其帐户相关的所有项目的集合:

GET http://example.com/api/2/projects/

共享项目(id = 2)是否应该在这个集合中,除了那些,用户B自己创建的?还是有更好的共享资源命名结构?

【问题讨论】:

为什么要一个租户 ID 来标识在不同租户下创建的项目? 应用程序中的资源不仅仅是项目。我打算将租户作为 API 的入口点。因此 id = 1 的用户 A 可以通过 GET example.com/api/1 访问他的所有资源 更准确地说,资源项目 2 现在可供用户 A 和用户 B 访问。在用户 A 和用户 B 的两个项目集合中显示项目 2 是否正确? 【参考方案1】:

专注于 URL 结构的设计对于 RESTful 架构来说实际上是行不通的。罗伊菲尔丁:

REST API 不得定义固定的资源名称或层次结构(客户端和服务器的明显耦合)。

另见this answer。

对于您的具体问题,我将返回用户有权访问的项目的(基本上是任意的)超文本链接列表。链接将包含明确的属性,以明确项目是由用户“拥有”还是“可访问”。为了提高可读性,您可以将资源 URL 设计为

http://example.com/user/user id
http://example.com/project/project id

GET http://example.com/user/2 之后的用户表示将包含链接列表,如

<a href="http://example.com/project/1" class="owned"/>
<a href="http://example.com/project/2" class="access-permitted"/>

HATEOAS 原则是 REST 固有的,它使大多数“我如何设计我的 URI”问题都过时了:

原理是客户端完全通过应用服务器动态提供的超媒体与网络应用进行交互。除了对超媒体的一般理解之外,REST 客户端不需要有关如何与任何特定应用程序或服务器交互的先验知识。

【讨论】:

这是有道理的。但是在 url 方案中放置一个tenant_id 作为入口点呢?由于应用程序应该为多个租户提供服务,因此用户 A 在 example.com/api/projects/ 上的资源与用户 B 不同。 为什么要返回 example.com/api/projects 上的租户特定项目?为什么不使用从 example.com/api/user/1 收到的项目列表?如果您使用另一个 URI 提供相同的信息,您有什么额外的好处? (如果您想提供一个»项目主列表«,其中包含所有拥有或被允许访问该项目的链接资源的项目,情况会有所不同。【参考方案2】:

在路径中使用租户信息可能是一个优势。通过这种方式,我们可以很容易地拥有例如对象列表。 在 get /tenant-id/projects 上查询 uri 我们可以为每个入口租户提供一个项目列表。 没有租户信息如何获取 url?

我的 2 美分

【讨论】:

我错误地将我的评论标记为社区 wiki。找不到如何取消标记。

以上是关于具有多租户和共享资源的 RESTful API的主要内容,如果未能解决你的问题,请参考以下文章

共享多租户 MySQL 数据库的可扩展性

多租户实现之基于MybatisMycat的共享数据库,共享数据架构

多租户实现之基于Mybatis,Mycat的共享数据库,共享数据架构

Mybatisplus搭建多租户模式(共享库表,按租户id字段区分租户)

多租户 - Azure IoT 客户是不是应该共享一个中心?

多租户模型