Запрос на получение разрешений у пользователя
Делаю систему разрешений для пользователя, у пользователя могут быть выданы права (определенные) или пользователь может состоять у воле у которой есть эти права,
set_id|user_id|role_id|permission_id|set_to|add_time |start_at|end_at|active|
------|-------|-------|-------------|------|-------------------|--------|------|------|
15| 2| | 7|{} |2021-03-15 13:00:43| | |true |
16| 1| 1| |{} |2021-03-15 13:02:29| | |true |
14| 1| | 7|{1,2} |2021-03-15 13:00:43| | |true |
17| | 1| 7|{99} |2021-03-15 13:02:43| | |true |
DDL
CREATE TABLE public.permission_set (
set_id serial NOT NULL,
user_id int4 NULL,
role_id int4 NULL,
permission_id int8 NULL,
set_to _int4 NULL DEFAULT '{}'::integer[],
add_time timestamp NULL DEFAULT timezone('utc'::text, now()),
start_at timestamp NULL,
end_at timestamp NULL,
active bool NULL DEFAULT true
);
пытаюсь получить все права и роли в которых есть эти прова и состоит пользователь:
select * from permission_set ps
where ps.user_id = 1 and ps.permission_id = 7 or ps.role_id = any(select role_id from permission_set pss where pss.permission_id = 7 and pss.active is true)
С самими правами проблем нет, но если они даны роле а пользователю дана уже эта роль , тот тут уже непонятно в моем запросе для всех пользователей возвращается роль где естьб это разрешение.
Вопрос как возвращать правильныйй рещультат? (Пользователь имеет разрешение напрямую или через роль - нужно проверить такой кес)
Пояснение:
- пользователи хранятся в таблице пользователей по колонке user_id ни связываются с таблицей permission_set приведенной выше.
- набор прав для роли храниться в ячейке set_to ввиде массива (используется intarray extantion) если пустой массив - это аналог true типо еслть права на этот пермишен - ответ да есть , если есть запись