sftf wrote:
> Но нет механизма контроля прав доступа одной роли по отношению к другой.
> Проблема #1: неуправляемые права ролей с привиоегией CREATEROLE по отношению к другим не суперюзерским ролям.
> Проблема #2: ограниченые возможности по котнролю присвоения ролей.
create table usr (
name text primary key,
privileges text
);
create function create_usr (text, text) returns int as $$
declare priv text;
begin
select into priv privileges from usr where name=session_user;
if not my_mega_system_is_admin(priv) then
return 0;
end if;
create role $1 nosuperuser nocreaterole;
insert into usr values ($1,$2);
end;
$$ language plpgsql security definer;
это только СХЕМАТИЧЕСКИЙ ПРИМЕР.
Идея в следущем.
Вы свои привилегии которыми хотите наделить юзеров храните в своей
специально (идеально) предназначенной для этого таблице И все ваши
админы и неадмины НЕ суперюзеры И управляете содержимым этой таблицы при
помощи SECURITY DEFINER функции, которая основываясь на данных о
привилегиях либо создаёт для вас юзера либо не создаёт.
Разумеется функций будет не одна и их можно зацепить за триггеры.
и вообще расширить систему прав КАК ПОЖЕЛАЕТЕ.