Безопасность на уровне строк с использованием prisma и postgres - PullRequest
0 голосов
/ 08 декабря 2018

Я использую серверы Prisma и Yoga Graphql с базой данных postgres.

Я хочу реализовать авторизацию для моих запросов в GraphQL.Я видел такие решения, как graphql-shield , которые хорошо решают column level security - это означает, что я могу определить разрешение и в соответствии с ним заблокировать или разрешить определенную таблицу или столбец данных (в терминах graphql заблокировать целую сущность)или конкретное поле).

Часть, на которой я застрял, - row level security - фильтрация строк по содержащимся в них данным - скажем, я хочу разрешить вошедшему в систему пользователю просматривать только те данные, которые относятся к немупоэтому в зависимости от значения в столбце user_id я бы разрешил или заблокировал доступ к этой строке (вошедший в систему пользователь - один из примеров, но в этом жанре есть и другие варианты использования).

Этот тип защиты требует запусказапрос, чтобы проверить, к каким строкам имеет доступ текущий пользователь, и я не могу найти способ (что не ужасно) реализовать это с помощью призмы.

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

Но я хочуt для работы с prisma, поэтому одной из идей, которые у нас были, была обработка этого на уровне БД с использованием postgres policy .Это может работать следующим образом:

  1. Каждый выполняемый нами запрос будет окружен «начать транзакцию» и «зафиксировать транзакцию»
  2. Перед запросом, который я хочу выполнить, «установите локальный контекст.user_id to 5 "
  3. Затем я хочу выполнить запрос (и политика отфильтрует результаты в соответствии с current_setting ('context.user_id'))

Чтобы это работало, японадобится prisma, чтобы я мог либо добавлять запросы pre / post к каждому выполняемому запросу, либо позволять мне устанавливать контекст для базы данных.

Но эти параметры недоступны в prisma.

Anyидеи?

1 Ответ

0 голосов
/ 10 декабря 2018

Вы можете использовать prisma-client вместо prisma-binding.

С помощью prisma-binding вы определяете преобразователь верхнего уровня, а затем делегирует prisma для всех вложений.

С другой стороны, prisma-client возвращает только скалярные значения типа, и вам необходимо определить средства разрешения для отношений.Это означает, что вы имеете полный контроль над тем, что вы возвращаете, даже для вложенных запросов.(См. документацию для примера)

Я бы предложил вам использовать prisma-client для применения фильтров безопасности к полям.

...