订阅授权

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

所有订阅授权规则都具有隐含的身份验证要求,因为规则通常针对 JWT 负载中的值进行评估。

规则

过滤

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

例如,以下是如何过滤不匹配正在侦听事件的用户 JWT 的User事件

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

事件

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

  • 已创建

  • 已更新

  • 已删除

  • 关系已创建

  • 关系已删除

例如,仅对类型本身的变异强制执行过滤,而不是其关系

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

无需身份验证的授权

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

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

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