Пропустить проверки RLS временно - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть таблицы с включенной безопасностью на уровне строк и соответствующими политиками - они работают очень хорошо.

Моя проблема в том, что иногда, основываясь на некоторых условиях, я хочу обойти политику для определенного c оператор во время выполнения функции.

что-то вроде:

...
statement 1
statement 2
if (some cond) then
   disable rls temporarily 
   statement 3 -- mostly delete rows the user can't normally see
   enable rls
else
   statement 3
end if

Я реализовал это путем создания функции check_cond, которая возвращает логическую оценку some cond и создал дополнительную политику выбора, которая вызывает это check_cond.

. Это работает - но на самом деле проблема в том, что запрос select * from tab теперь выглядит так: select * from tab where <original policy condition> or check_cond()

This or check_cond() заставляет postges всегда выполнять полное сканирование таблицы, так как он не может оценить предварительное планирование результата.

Если бы я мог написать код «dynamici c» в политике, я бы смог добавить / удалить условия, основанные на значении check_cond(), но насколько я знаю, это невозможно.

Любой умный способ, который позволил бы мне временно отключить rls или динамически добавлять условия без сакра производительность зачистки?

Спасибо.

1 Ответ

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

Самый простой способ - иметь функцию SECURITY DEFINER, принадлежащую суперпользователю, который запускает:

ALTER ROLE someuser BYPASSRLS;

, где someuser - это пользователь, который запускает операторы SQL.

После этого вы можете повторно включить его таким же образом.

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

Лучшим способом было бы чтобы определить функцию определения безопасности, принадлежащую пользователю с BYPASSRLS, которая выполняет удаление для вас.

Примечание: по соображениям безопасности, всегда SET search_path, когда Вы определяете SECURITY DEFINER функцию.

...