订阅授权

这是 GraphQL 库版本 6 的文档。对于长期支持 (LTS) 版本 5,请参考 GraphQL 库版本 5 LTS

订阅需要它们自己的授权规则,这些规则使用 @subscriptionsAuthorization 指令配置。这些规则与查询和变异的授权规则不同,因为它们使用可用于订阅事件的过滤规则。

所有订阅授权规则都对认证有一个隐含的要求,因为这些规则通常针对 JWT 负载中的值进行评估。

规则

过滤

过滤规则可以防止包含用户无权访问的信息的事件到达用户 - 他们不会收到任何表明这种情况的指示。当事件从数据库返回时,在将事件广播到订阅的 GraphQL 客户端之前,会对这些规则进行评估。

例如,以下是如何过滤掉与监听事件的用户的 JWT 不匹配的 User 事件

type User @node @subscriptionsAuthorization(filter: [
    { where: { node: { id_EQ: "$jwt.sub" } } }
]) {
    id: ID!
}

事件

可以将过滤配置为仅在某些事件上执行

  • 已创建

  • 已更新

  • 已删除

  • 关系已创建

  • 关系已删除

例如,要仅要求对类型本身的变异进行过滤,而不对其关系进行过滤

type User @node @subscriptionsAuthorization(filter: [
    { events: [CREATED, UPDATED, DELETED], where: { node: { id_EQ: "$jwt.sub" } } }
]) {
    id: ID!
}

未经身份验证的授权

默认情况下,每个授权检查都隐含地需要身份验证,但可以在每个规则的基础上禁用此功能。例如,当一个节点具有一个属性来标记该节点是否应该公开时,这种情况就可能发生。

例如,在某些 Post 节点是私有而其他 Post 节点是公开的情况下,以下是如何设置此功能

type Post @node @subscriptionsAuthorization(filter: [
    { requireAuthentication: false, where: { node: { public_EQ: true } } }
]) {
    title: String!
    content: String!
    public: Boolean!
}