Политики безопасности строк PostgreSQL не работают для СОЗДАТЬ ПОЛИТИКУ ДЛЯ ОБНОВЛЕНИЯ С ПРОВЕРКОЙ (false);

Я пытаюсь настроить безопасность на уровне строк для некоторых таблиц. К настоящему времени у меня не было проблем с INSERT и SELECT, теперь я пытаюсь справиться с UPDATE.

Я пробовал много вещей, но действительно застрял, когда определил политику с помощью WITH CHECK (false), и у меня есть возможность выполнять обновления в этой таблице с пользователем rls, несмотря на определенную политику.

Почему так происходит? Я ожидал, что все обновления в этой таблице не будут выполнены, потому что WITH CHECK - логический валидатор.

Вот мой код:

CREATE TABLE t (
                "id" SERIAL PRIMARY KEY NOT NULL, 
                "name" varchar (50) NOT NULL
               );
create role rls_user NOINHERIT;
GRANT USAGE ON SCHEMA public TO rls_user;

GRANT SELECT, UPDATE, INSERT ON ALL TABLES IN SCHEMA public TO rls_user;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO rls_user;

alter table t enable row level security;

CREATE POLICY t_update ON t
FOR UPDATE WITH CHECK (false);

----> CREATE POLICY t_update ON t
----> FOR UPDATE USING (false); ---> also doesn't work
set role rls_user;

UPDATE t 
SET name = 'blabla'
WHERE "id" = 1;

---> expected: UPDATE FAILED

---> result: 
--->           UPDATE 0

--->           Query returned successfully in 73 msec. 

person noam steiner    schedule 11.08.2020    source источник


Ответы (1)


Ваша политика делает таблицу пустой для rls_user, потому что в ней нет предложения USING.

Следовательно, UPDATE никогда не будет изменять строку (UPDATE 0), и, поскольку ни одна строка не изменяется, ни одна строка не должна проходить условие CHECK, и ошибка не генерируется.

Обратите внимание, что вы предоставили пользователю UPDATE права доступа к таблице, поэтому ему разрешено запускать все обновления в таблице, если измененные строки соответствуют условию CHECK.

person Laurenz Albe    schedule 12.08.2020
comment
Спасибо! когда я увидел Query returned successfully, я подумал, что политика не работает, я ожидал ошибки. Я не заметил нуля в UPDATE 0. - person noam steiner; 12.08.2020