概念性问题:多个端点客户端/管理员的共享GraphQL模式

问题描述

上下文
我正在使用NX Workspace来组织两个不同的角度前端(客户端和管理员)。为了分隔客户端和管理员逻辑,客户端和管理员使用了两个不同的nestJS后端服务(包括GraphQL)。 由于这两个服务都从单个MongoDB提取数据,因此两个前端都使用单个数据库库。

enter image description here

两个后端服务当前都使用通过模式优先方法生成的单个GraphQL模式和单个数据库层。在大多数情况下,类型和字段定义在客户端和管理员之间匹配,但是在某些情况下,单个服务需要附加的查询参数或字段。 例如,管理服务取决于类型confirmed的字段bannedUser,而客户端服务不应该使用它们。 此外,例如getUsers查询不应通过客户端服务公开。

type User {
    _id: ID
    name: String
    email: String

    confirmed: Boolean
    banned: Boolean
}

type Query {
    getUserById(userId: String): User
    getUsers(): [User]
}

问题
在类型几乎相似的情况下,是否有最佳实践来继续使用GraphQL模式。

解决方法

您可以使用架构指令直接以声明方式在Graphql架构中定义授权规则。

一种常见的方法是将角色分配给用户,然后使用这些角色来允许/阻止对某些突变或查询的访问。

因此,以您的示例为例,我假设来自client的任何请求都将由具有client角色的用户发出,而来自admin的任何请求都将具有{{ 1}}

因此,以您将admin查询限制为getUsers的示例为基础,我们可以将此指令添加到我们的模式中:

admins

您可以阅读更多有关如何在nestJs文档https://docs.nestjs.com/graphql/directives

中实际实现自定义指令type User { _id: ID name: String email: String confirmed: Boolean banned: Boolean } type Query { getUserById(userId: String): User getUsers(): [User] @hasRole(roles: [admin]) } 的信息。