Контроль доступа Фильтрация запроса перед его отправкой на сервер / БД Prisma
Щас пользуюсь accesscontrol
управлять ACL, и он отлично работает. Это выглядит примерно так:
const methods = {
async update(parent, { data }, ctx, info) {
const acUpdate = ac.can('role').updateOwn('model')
if (! acUpdate.granted) throw new ACError()
const filtered = acUpdate.filter({ ...data })
return await ctx.db.mutation.updateOrganization({
data: filtered,
where: { id }
}, info)
}
}
Однако на Query
Метод из GraphQL Я не знаю, как фильтровать запросы к БД. Например, для вложенного запроса это может выглядеть так:
{
model {
id
name
user {
id
name
pictures {
id
name
}
}
}
}
Таким образом, в резольвере он будет проверять, имеют ли они доступ к модели, а затем отправляет запрос на сервер Prisma без фильтрации схемы GQL. В этом сценарии предположим, что пользователь имеет доступ к модели чтения, но не пользователь. В идеале я хотел бы сделать permission.filter(...)
на фактической схеме запроса (информация?) перед отправкой в Prisma. Кто-нибудь из вас решил это? Конечно, можно отфильтровать запрос после его разрешения, но этот уровень вычислений не является необходимым и может вызвать проблемы при злоупотреблении.
1 ответ
У меня была точно такая же проблема, и теперь я решаю ее, используя клиент prisma для выполнения запросов к prisma. Клиент Prisma каждый раз запрашивает только один уровень, так что вы получаете полный контроль над распознавателями и во вложенных запросах. См. /questions/16595982/bezopasnost-na-urovne-strok-s-ispolzovaniem-prisma-i-postgres/16596000#16596000
Я узнал, что это тема, к которой я обращался в одном из моих ответов на вопросы, потому что я думал, что это было задано там. Теперь я понимаю, что, должно быть, я перепутал его с тем, что он открыт в одной из вкладок сзади.
https://github.com/maticzav/graphql-shield/issues/113
Я думаю, что вторая часть моего ответа касается вас больше всего. Я надеюсь, что вы найдете это полезным!