问题描述
上下文
我正在使用NX Workspace来组织两个不同的角度前端(客户端和管理员)。为了分隔客户端和管理员逻辑,客户端和管理员使用了两个不同的nestJS后端服务(包括GraphQL)。
由于这两个服务都从单个MongoDB提取数据,因此两个前端都使用单个数据库库。
两个后端服务当前都使用通过模式优先方法生成的单个GraphQL模式和单个数据库层。在大多数情况下,类型和字段定义在客户端和管理员之间匹配,但是在某些情况下,单个服务需要附加的查询参数或字段。
例如,管理服务取决于类型confirmed
的字段banned
或User
,而客户端服务不应该使用它们。
此外,例如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])
}
的信息。