Я использую серверы Prisma и Yoga Graphql с базой данных postgres.
Я хочу реализовать авторизацию для моих запросов в GraphQL.Я видел такие решения, как graphql-shield , которые хорошо решают column level security
- это означает, что я могу определить разрешение и в соответствии с ним заблокировать или разрешить определенную таблицу или столбец данных (в терминах graphql заблокировать целую сущность)или конкретное поле).
Часть, на которой я застрял, - row level security
- фильтрация строк по содержащимся в них данным - скажем, я хочу разрешить вошедшему в систему пользователю просматривать только те данные, которые относятся к немупоэтому в зависимости от значения в столбце user_id я бы разрешил или заблокировал доступ к этой строке (вошедший в систему пользователь - один из примеров, но в этом жанре есть и другие варианты использования).
Этот тип защиты требует запусказапрос, чтобы проверить, к каким строкам имеет доступ текущий пользователь, и я не могу найти способ (что не ужасно) реализовать это с помощью призмы.
Если бы я работал без призмы, я бы реализовал это вуровень каждого распознавателя, но так как я пересылаю свои запросы в призму, я не контролирую внутренние преобразователи во вложенном запросе.
Но я хочуt для работы с prisma, поэтому одной из идей, которые у нас были, была обработка этого на уровне БД с использованием postgres policy .Это может работать следующим образом:
- Каждый выполняемый нами запрос будет окружен «начать транзакцию» и «зафиксировать транзакцию»
- Перед запросом, который я хочу выполнить, «установите локальный контекст.user_id to 5 "
- Затем я хочу выполнить запрос (и политика отфильтрует результаты в соответствии с current_setting ('context.user_id'))
Чтобы это работало, японадобится prisma, чтобы я мог либо добавлять запросы pre / post к каждому выполняемому запросу, либо позволять мне устанавливать контекст для базы данных.
Но эти параметры недоступны в prisma.
Anyидеи?