Мультитенантная политика IAM DynamoDB (совместное использование документов с другими пользователями) - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь создать мультитенантное приложение с 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 или подобным.

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

1 Ответ

0 голосов
/ 07 июня 2018

Вы можете легко ограничить доступ к определенным атрибутам (только атрибуты).

Однако, чтобы получить более детализированные шаблоны доступа, вам необходимо:

  • разгрузите задачу контроля доступа к вашему коду (например, Lambda)
  • или вы можете оценить свои шаблоны доступа (что, как правило, хорошо, но может быть немного сложнее) и модельваши данные соответственно

Вообще говоря, при разработке приложений NoSQL вы всегда должны оценивать, как вы используете ваши данные.Они обычно адаптированы для конкретного случая использования - в отличие от СУБД, которые разрешают очень общие запросы независимо.

Есть хороший пример моделирования реляционных данных в терминах DynamoDB здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...