PostgreSQL Политика RLS для указания c пользователь не работает должным образом и применяется ко всем пользователям - PullRequest
0 голосов
/ 03 марта 2020

В моей БД 2 пользователя, один "сильный", а другой "слабый". Я хочу применить политику RLS только для одного из них, слабого пользователя. Это означает, что когда сильный пользователь запрашивает таблицу, он должен получить все строки. Но когда слабый пользователь запрашивает таблицу, политика будет применена, и она вернет только разрешенные строки.

Я создал таблицу и применил политику RLS только к слабому пользователю. Но даже при запросе к сильному пользователю политика выполняется и не позволяет мне получить все строки. Я использую PostgreSQL версию 11.4.

Вот как я создал политику (я создал политику с другим третьим пользователем, который является администратором и владельцем таблицы)

CREATE TABLE account_test
(
    id bigserial not null,
    description varchar(200),
    tenant_id UUID not null
);
ALTER TABLE account_test ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_policy ON account_test TO weak_user
                        USING (tenant_id = current_setting('rls.tenant_id')::uuid);

account = # select * from pg_policies;

schemaname | имя таблицы | название политики | разрешительный | роли | cmd | квали | with_check ------------ + -------------- + --------------- + ----- ------- + --------------- + ----- + -------------------- ------------------------------------------ + ------- ----- аккаунт | account_test | tenant_policy | РАЗРЕШЕНИЕ | {weak_user} | ВСЕ | (tenant_id = (current_setting ('rls.tenant_id' :: text)) :: uuid) |

Теперь вставка и выбор с правами администратора всегда работает, потому что это владелец:

insert into account_test (description, tenant_id) VALUES ('desc111', '11111111-c929-462e-ade4-074c81643191');
select * from account_test;  

здесь нет проблем, и все строки возвращены.

При попытке войти в систему с помощью weak_user и выбрать, я не получаю строк, как ожидалось:

select * from account_test; 
-- returns 0 rows as expected (weak_user).

Если я установил параметр, политика применяется и я получаю данные, как и ожидалось:

select set_config('rls.tenant_id', '11111111-c929-462e-ade4-074c81643191',true);
select * from account_test; 
-- returns 1 row as expected

Теперь, когда я вхожу в систему с помощью strong_user и выполняю запрос «select * from account_test», я ожидаю, что будут возвращены все строки, потому что политика применяется только для weak_user. Тем не менее, я получаю то же поведение, что и для weak_user, и строки не возвращаются Также запрос с set_config ничего не возвращает.

Чего мне не хватает? Это ожидаемое поведение? Может кто-нибудь объяснить?

...