Обрабатывать одного пользователя в нескольких «учетных записях» с помощью AWS Cognito? - PullRequest
0 голосов
/ 16 мая 2019

У нас есть пример использования AWS Amplify и Cognito для аутентификации пользователя, где пользователю будут предоставлены определенные роли для авторизации, например, «создать объект», «удалить объект» и т. Д.

Теперь мыесть новое требование, когда пользователь должен иметь возможность принадлежать к нескольким организациям.Это означает, что пользователь должен иметь возможность принадлежать к разным ролям в разных организациях, например, иметь возможность удалять в одной организации, но не в другой (вход в систему с той же учетной записью / электронной почтой).

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

Может ли это быть решено с помощью Cognito вообще или может бытьпредпочтительнее закодированное решение и использовать только Cognito для аутентификации?

1 Ответ

2 голосов
/ 05 июня 2019

Я предложил выполнимое решение этих требований в https://github.com/aws-amplify/amplify-cli/issues/630. И оно работает в моем приложении.

Да, поскольку может быть так много организаций, использование Cognito нецелесообразногруппа для представления организации.

Идея моего решения состоит в том, чтобы иметь 3 пользовательских модели: User, Organization и Membership.Это позволяет устанавливать отношения «многие ко многим» между пользователями и организациями: пользователь может принадлежать нескольким организациям, а организация может использовать несколько пользователей.

  • User может содержать свою собственную информацию.Вы также можете позволить пользователю иметь тот же id, что и в Cognito, так что вы можете выровнять пользователя Cognito с User, хранящимся в DynamoDB.
  • Organization может содержать свою собственную информацию.
  • Membership является критическим мостом, поскольку он соединяется с обоими сторонами (пользователем и организацией), и вы можете закодировать информацию о роли здесь.

См. раздел «многие ко многим» , чтобы понять, как Membership работает в AWS Amplify GraphQL Transform.

schema.graphql выглядит следующим образом:

type User @model {
  id: ID!
  organizations: [Membership] @connection(name: "Membership_User")
}

type Organization @model {
  id: ID!
  users: [Membership] @connection(name: "Membership_Organization")
}

type Membership @model {
  id: ID!
  user: User! @connection(name: "Membership_User")
  organization: Organization! @connection(name: "Membership_Organization")
  role: Role!
}

type Role {
  canCreate: Boolean!
  canDelete: Boolean!
}

В моем выпуске github представьте Project как ваш Organization, а остальные почти такие же.

...