Как разрешить вставку роли в таблицу (для регистрации), но после этого запретить дальнейшие вставки для этого пользователя?

Это мой вопрос. Я использую Hasura и определяю «пользовательские» разрешения.

Разумеется, пользователям разрешено изменять свою информацию и не разрешается вставлять новые записи в мою таблицу пользователей.

Но когда они регистрируются, им должно быть разрешено вставлять самих себя. Итак, как я могу определить это разрешение?

Чтобы прояснить мой сценарий: у меня есть приложение React, которое использует внешнего провайдера OpenID. Таким образом, там регистрируется новый пользователь, и провайдер возвращает в мое приложение JWT, содержащую пользователя, которого я никогда раньше не видел. Мое приложение этого не знает, оно просто использует токен доступа для отправки в бэкэнд Hasura для получения дополнительной информации об этом пользователе, используя роль «пользователь». Но он использует запрос, который автоматически вставит пользователя, если он не найден.


person raarts    schedule 05.06.2020    source источник


Ответы (2)


В таблице пользователей для роли пользователя нужно добавить разрешение с настраиваемой проверкой. И проверка должна быть user_id равна x-hasura-user-id.

{"id":{"_eq":"x-hasura-user-id"}}
person Leonardo Alves    schedule 05.06.2020
comment
Но до того, как будет вставлена ​​запись для нового пользователя, еще нет идентификатора пользователя? - person raarts; 05.06.2020
comment
В этом случае лучше всего было бы вставить серверную часть пользователя. Вы либо используете роль администратора, либо роль на стороне сервера - person Leonardo Alves; 06.06.2020

Для пользователей, не вошедших в систему, используйте анонимную роль, установив разрешения, которые имеют смысл для вашего варианта использования: https://hasura.io/docs/1.0/graphql/manual/auth/authorization/common-roles-auth-examples.html#anonymous-not-logged-in-users

Редактировать после комментария:

Ах я вижу. Когда пользователь заходит в ваше приложение, ваше приложение извлекает некоторые данные, которые, как он ожидает, должен иметь каждый пользователь (например, возможно, хранилище информации о пользователе в пользовательской таблице). Но поскольку это новый пользователь, этой информации там нет.

На данный момент ваше приложение React знает, что:

  • есть кто-то с законно подписанным файлом cookie JWT (используйте библиотеку для проверки подписи) и
  • нет никакой информации о пользователе от бэкэнда. Поэтому приложение React показывает: «Добро пожаловать, новый пользователь, подождите, пока мы настраиваем вашу учетную запись».

Затем приложение React вносит изменения в действие регистрации Hasura, которое вы подготовите. Как только это вернется, вы продолжите как обычно (перенаправите пользователя на его домашнюю страницу).

person rollingBalls    schedule 06.06.2020
comment
Извините, я немного уточнил свой вопрос после того, как прочитал ваш и другие ответы. Мое приложение не знает, что пользователь только что зарегистрировался, поэтому не будет указывать, что у него анонимная роль. Может мне нужно просто вернуть, что пользователя не существует, а затем переключиться на анонимную роль, чтобы вставить запись? Это означало бы предоставление анонимной роли неограниченных разрешений на вставку - person raarts; 06.06.2020