graphql - 概念性问题:多个端点的共享 GraphQL 架构(客户端/管理员)
问题描述
上下文
我正在使用 NX 工作区来组织两个不同的 Angular 前端(客户端和管理员)。为了分离客户端和管理逻辑,包括 GraphQL 在内的两种不同的 NestJS 后端服务用于客户端和管理。由于两个服务都从单个 MongoDB 获取数据,因此两个前端都使用单个数据库库。
两种后端服务目前都使用通过模式优先方法和单个数据库层生成的单个 GraphQL Schema。在大多数情况下,客户端和管理员之间的类型和字段定义匹配,但在某些情况下,单个服务需要额外的查询参数或字段。例如,管理服务取决于字段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 的任何请求的用户角色为admin
因此,要以您将getUsers
查询限制为仅的示例为基础,admins
我们可以将此指令添加到我们的架构中:
type User {
_id: ID
name: String
email: String
confirmed: Boolean
banned: Boolean
}
type Query {
getUserById(userId: String): User
getUsers(): [User] @hasRole(roles: [admin])
}
hasRoles
您可以在 nestJs 文档https://docs.nestjs.com/graphql/directives中阅读有关如何实际实现自定义指令的更多信息
推荐阅读
- asp.net-core - 请求来源 null 无权访问资源
- html - ::之前不工作。可能是什么问题
- api - 无法将现有项目链接到 Google Play 控制台 API
- sql - CASE WHEN 2 日期匹配的 SQL 查询
- mongodb - MongoDb 聚合查询性能缓慢问题
- math - 将正交投影拟合到场景和相机
- python - 为什么 SQLAlchemy 不添加表?
- python - Docker 构建通过 CLI 工作,但不是来自 Compose(指相同的 Dockerfile)
- visual-studio-code - 为什么 VS Code 上的 Haxe 代码没有语法高亮显示?
- css - 每个浏览器可以读取的最大 CSS 文件大小?如何绕过它的限制?