Реализация пользовательских разрешений пользователей в GraphQL и Hasura - PullRequest
1 голос
/ 25 февраля 2020

Я создаю веб-приложение, которое позволяет пользователям общаться в нескольких разных комнатах, и я надеюсь, что смогу использовать GraphQL и Hasura для этого проекта. Будут администраторы, которые могут создавать / удалять комнаты (wow-room, lol-Room, pubg-room), создавать / удалять пользователей и создавать / удалять разрешения (admin, wow, lol, pubg) вместе с назначением ролей пользователям. Пользователи смогут видеть любые комнаты, на которые у них есть разрешения.

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

1 Ответ

1 голос
/ 25 февраля 2020

Хотя Hasura может обрабатывать динамические c роли (вы можете использовать API для создания новых ролей и новых правил доступа на лету) с Hasura, я думаю, что в этом случае это не требуется.

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

Хасура позволяет установить правило разрешений, которое пересекает отношения, что делает это возможным. Посмотрите пример article-сотрудники в документах Hasura .

Предполагая, что ваши модели rooms, users и room_users и у вас настроены отношения так, чтобы room.users возвращает список пользователей для определенной комнаты, разрешение для роли user в таблице rooms может быть выражено следующим образом:

Allow SELECT on a row in rooms if
rooms.users.id: _eq: x-hasura-user-id

Это означает: если список пользователей комнаты содержит по крайней мере один user_id , равный x-hasura-user-id , затем предоставьте доступ к этой комнате.

Я настроил это в приложении heroku : https://multiple-roles-hasura.herokuapp.com/console/api-explorer

Попробуйте следующие запросы в GraphiQL:

  1. Установите заголовки на:
x-hasura-role: user
x-hasura-user-id: 1
Запустите следующий запрос:
 query {
   rooms {
     id
     name
   }
 }
Вы увидите, что ответ содержит только те комнаты, к которым пользователь1 имеет доступ к Переключатель x-hasura-user-id с различными значениями 1, 2, 3, 4, 5, 6 и вы увидите разные результаты для одного и того же запроса. В основном правильные комнаты, к которым имеет доступ только текущий пользователь.

Проверьте модели и разрешения для моделей на:

...