订阅授权
这是 GraphQL 库版本 7 的文档。对于长期支持 (LTS) 版本 5,请参阅 GraphQL 库版本 5 LTS。 |
订阅需要自己的授权规则,这些规则通过 @subscriptionsAuthorization
指令配置。这些规则与查询和突变(mutations)的授权规则不同,因为它们使用适用于订阅事件的过滤规则。这些过滤规则只能用于根据受事件影响的节点的属性进行过滤。
所有订阅授权规则都隐含地要求认证,因为这些规则通常是根据 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!
}