AWS AppSync 订阅:基于更新文档中对象的复杂授权
AWS AppSync Subscriptions: Complex Authorization based on Object with in Updated Document
将被突变更改的对象包含一个 permissions
数组,该数组包含 user
个对象,这些对象由 userId
和 write
权限布尔值组成。如果用户的 userId
出现在列表中,则该用户对该对象具有读取权限。如果write
设置为true,用户也有写权限。
从突变的角度来看,这使得修改对象更容易,但它使处理订阅变得更加困难,因为我无权访问在创建订阅时更新的对象。因此,我无法确保用户只有在拥有适当权限的情况下才能获得对象的更新。
我认为这没什么区别(因为我无法在客户端安全地处理这个问题),但我正在构建一个 React 网络客户端。
有什么可行的方法解决这个问题吗?
一个可能的解决方案是设置一个订阅所有新突变的服务器端作业。这个服务器端侦听器将接收每个新的突变,查看权限列表,并使用 None 数据源解析器发布给授权用户。用户将只被允许使用他们的用户 ID 订阅。
架构看起来像这样:
type Object {
permissions: [User]
//.. Other fields
}
type User {
userId: ID!
write: Boolean
}
// The server listener will populate this
type PublishPayload {
userId: ID!
objectToPublish: Object
}
type Mutation {
// The original mutation
updateObject(): Object
// The server-side listener will use this to publish. Attach a None Resolver to it.
publishToUser(userId: ID!): PublishPayload
}
type Subscription {
// This subscription is used by the server to listen to all updateObject mutations
serverSubscription(): Object
@aws_subscribe(mutations:["updateObject"])
// This subscription is used by the users.
// You would add a resolver to it that fails authorization if they try to subscribe to a different user.
userSubscription(userId: ID!): PublishPayload
@aws_subscribe(mutations:["publishToUser"])
//.. More schema
希望对您有所帮助!
将被突变更改的对象包含一个 permissions
数组,该数组包含 user
个对象,这些对象由 userId
和 write
权限布尔值组成。如果用户的 userId
出现在列表中,则该用户对该对象具有读取权限。如果write
设置为true,用户也有写权限。
从突变的角度来看,这使得修改对象更容易,但它使处理订阅变得更加困难,因为我无权访问在创建订阅时更新的对象。因此,我无法确保用户只有在拥有适当权限的情况下才能获得对象的更新。
我认为这没什么区别(因为我无法在客户端安全地处理这个问题),但我正在构建一个 React 网络客户端。
有什么可行的方法解决这个问题吗?
一个可能的解决方案是设置一个订阅所有新突变的服务器端作业。这个服务器端侦听器将接收每个新的突变,查看权限列表,并使用 None 数据源解析器发布给授权用户。用户将只被允许使用他们的用户 ID 订阅。
架构看起来像这样:
type Object {
permissions: [User]
//.. Other fields
}
type User {
userId: ID!
write: Boolean
}
// The server listener will populate this
type PublishPayload {
userId: ID!
objectToPublish: Object
}
type Mutation {
// The original mutation
updateObject(): Object
// The server-side listener will use this to publish. Attach a None Resolver to it.
publishToUser(userId: ID!): PublishPayload
}
type Subscription {
// This subscription is used by the server to listen to all updateObject mutations
serverSubscription(): Object
@aws_subscribe(mutations:["updateObject"])
// This subscription is used by the users.
// You would add a resolver to it that fails authorization if they try to subscribe to a different user.
userSubscription(userId: ID!): PublishPayload
@aws_subscribe(mutations:["publishToUser"])
//.. More schema
希望对您有所帮助!