Лучший способ обеспечить контроль доступа к объектам хранилища данных с родительской связью

Предположим, у меня есть три вида сущностей — пользователи,сообщения,комментарии.
Каждый пост имеет родительского пользователя и каждый комментарий имеет Родительский пост т. е.
Пользователь — > пост — >>комментарий.

Мой API выглядит следующим образом:

ключ вот ключ websafe сущности

GET/user / {key} — получить информацию о пользователе

POST / user / {key} / post/ — создать сообщение

GET/post / {key} — получить сообщение

POST/post / {key} / comment/ — создать комментарий

GET/comment / {key}

Вопросы :

  1. Проблема здесь в том, что если user1 знает ключ user2, то user1 может
    доступ к данным user2.
  2. Я читал о multi-tenancy в datastore, но запутался ли это
    подходит для этого типа дизайна хранилища данных или нет. Потому что у меня есть
    больше чем 100 потребителей и оно могут увеличить.
  3. Должен ли я вручную обрабатывать это? Если да, то что будет
    лучший способ сделать это?

1 ответ

  1. Это хороший, спокойный дизайн API (хотя популярным соглашением является множественность коллекций —/users/{key}/posts/{key}/comments, и т.д.).

    Проверки авторизации следует обрабатывать явно. Реализация GET /users/{key}должна проверить, имеет ли вызывающий объект права на просмотр этого объекта и возврат HTTP 401 или 403. Предположительно вызывающий определяется каким-то заголовком аутентификации.

    Вы, вероятно, рассматриваете альтернативу, как GET /myuserили GET /myposts. Иногда это может быть полезно, но лучше избегать такого рода вещей, если это возможно-это нарушает дух покоя и кэш-способность GET. Кроме того, лучше всего иметь URL-адреса, которые работают не только для конкретного пользователя, но и позволяют любому суперпользователю выполнять те же действия от имени пользователя. Эти URL-адреса должны работать с явными объектами.

    Re: Multitenancy. Я бы настоятельно советовал избегать этого. Я не думаю, что это особенно полезно, и это будет особенно запутанным, если вы новичок в GAE. Просто смоделируйте необходимые данные — если записи связаны с пользователем, сохраните эту информацию в записи и используйте ее для проверки авторизации или фильтрации.