Я пытаюсь создать мультитенантное приложение с DynamoDB и Cognito.В документации довольно ясно рассказывается о том, как реализовать детальную авторизацию, чтобы пользователи могли получать доступ только к своим собственным записям, добавив условие в политику доступа IAM следующим образом:
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${cognito-identity.amazonaws.com:sub}"
]
}
}
Это отлично подходит для разрешения пользователямчитать и записывать свои собственные записи, когда идентификатор пользователя Cognito является хеш-ключом строки, но я пытаюсь разрешить другим пользователям доступ только для чтения к некоторым записям.
Взять какПример моей модели для студента, у которого есть несколько курсов:
{
“student_id”: “ABC-1234567”,
“course_name”: “Statistics 101”,
“tutors”: [“Cognito-sub-1”, “Cognito-sub-2”],
“seminar_reviews”: [
{
“seminar_id”: “XXXYYY-12345”
“date”: “2018-01-12”,
“score”: “8”,
“comments”: “Nice class!”
},
{
“seminar_id”: “ABCDEF-98765”
“date”: “2018-01-25”,
“score”: “3”,
“comments”: “Boring.”
}
]
}
(Cognito-sub-1
- это идентификатор Cognito преподавателя)
С условиями политики выше, примененными к роли IAM пользователяпользователь может читать и писать этот документ, поскольку хеш-ключ (student_id
) является идентификатором Cognito пользователя.
Я бы также хотел, чтобы перечисленные в документе преподаватели имели доступ только для чтения к определенным атрибутам, но я не могу найти никаких примеров того, как это можно сделать.Я знаю, что не могу использовать условие dynamodb:LeadingKeys
, поскольку tutor не является хеш-ключом таблицы.Можно ли это сделать, если я настрою Глобальный вторичный индекс (GSI), который использует список преподавателей в качестве хеш-ключа?
Если это можно сделать с помощью индекса, я предполагаю, что это позволит только доступ для чтенияк этому индексу (так как индекс не может разрешить операции записи).Есть ли альтернативный метод, позволяющий разрешить доступ на запись на основе атрибута, который не является хеш-ключом?
В качестве альтернативы, можно ли использовать более длинную строку в качестве хеш-ключа, объединяя такие атрибуты, как ”owner”:
и ”read-only”:
, которыесодержать списки идентификаторов Cognito и использовать это в моей политике для создания более детальной модели разрешений, основанной только на хэш-ключе?Это предполагает, что политика может декодировать списки из строки, так как DynamoDB не позволяет хеш-ключам быть списком, объектом JSON или подобным.
Мне не удалось найти какие-либо ресурсы, которые считают детализированнымикроме контроля доступа, позволяющего пользователям читать / писать только свои собственные записи, так что если кто-то может направить меня к некоторым, это было бы хорошим началом.