Авторизация AWS Amplify (AppSync Cognito) с использованием динамических групп для каждой организации/арендатора

#amazon-web-services #amazon-cognito #aws-amplify #aws-appsync #graphql-schema

Вопрос:

У меня есть приложение AWS Amplify, которое имеет структуру с несколькими организациями:

Организация A -> Содержание организации A Организация B ->> Содержание организации B

Допустим, у нас есть пользователь Алиса, Алиса принадлежит к обеим организациям, однако у нее разные роли в каждой из них, в организации А Алиса является администратором и имеет больше прав (т. Е. может удалять контент или изменять контент других), в то время как в Организации Б она является обычным пользователем.

По этой причине я не могу просто установить регулярные группы в Amplify (Cognito), потому что некоторые пользователи, такие как Алиса, могут принадлежать к разным группам в разных организациях.

Одним из решений, которое , как я думал, было создание группы для каждой комбинации организации и роли. т. Е.: OrganizationA__ADMIN , OrganizationB__USER и т. Д., Чтобы я мог ограничить доступ к схеме, используя директиву групповой аутентификации в Content модели:

{allow: group, groupsField: "group", operations: [update]},

Содержимое будет содержать group поле со значением: OrganizationA__ADMIN

Затем я мог бы добавить пользователя в группу с помощью API запросов администратора, однако, похоже, невозможно динамически добавлять пользователя в группу, мне пришлось бы вручную создавать каждую группу каждый раз, когда создается новая организация, что в значительной степени убивает мою идею.

Есть еще какие-нибудь идеи о том, как я могу достичь результата, к которому стремлюсь? Я знаю, что могу добавить ограничение на код, но это менее безопасно, и я бы предпочел иметь это ограничение на уровне базы данных.

Ответ №1:

Рассмотрите возможность создания дополнительных утверждений в обработчике предварительной генерации токенов

В принципе, вы можете создать атрибут, который включает сопоставление ролей организации

напр.

 {
// ...
  "custom:orgmapping": "OrgA:User,OrgB:Admin"
}
 

затем преобразуйте их в обработчике предварительной генерации токенов в «псевдо» группы, которые на самом деле не существуют в пуле.

Комментарии:

1. Спасибо! Я попробую это и обновлю здесь