Подписки AWS AppSync: комплексная авторизация на основе объекта в обновленном документе
Объект, который будет изменен мутацией, содержит permissions
массив, который содержит user
объекты, которые состоят из userId
и write
разрешение логическое. Если пользователь userId
присутствует в списке, пользователь имеет разрешение на чтение объекта. Если write
Значение true, пользователь также имеет разрешение на запись.
Это упрощает изменение объекта с точки зрения мутации, но значительно усложняет обработку подписок, поскольку у меня нет доступа к объекту, который обновляется при создании подписки. Таким образом, я не могу гарантировать, что пользователь получит обновления объекта только при наличии соответствующих разрешений.
Я не думаю, что это имеет значение (так как я не могу безопасно справиться с этим на стороне клиента), но я создаю веб-клиент React.
Есть ли реальный способ обойти это?
1 ответ
Одним из возможных решений было бы установить работу на стороне сервера, которая подписывается на все новые мутации. Этот прослушиватель на стороне сервера будет получать каждую новую мутацию, просматривать список разрешений и публиковать данные для авторизованного пользователя с помощью средства распознавания источника данных None. Пользователям будет разрешено подписаться только на подписку с их идентификатором пользователя.
Схема будет выглядеть примерно так:
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
Надеюсь это поможет!