Я конечно извиняюсь, если я баян, но у меня вот какой вопрос:
Какие существуют способы определения привилегий для пользователей (не стандартные), т.е не с Помошью GRANT, REVOKE, и привилегий самих ролей.
Для примера:
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 функции, которая основываясь на данных о
привилегиях либо создаёт для вас юзера либо не создаёт.
Но это для меня не подходит
Проблема:
Нет возможности управлять тем, что может делать данная роль с другими ролями.
Да и сам по себе подход
Да и сам по себе подход довольно глупый.
При создании пользователя в БД, он может подключится к БД с помощью любой клиентской программы и шарится по вашим данным плюя на вашу проверку привилегий. И надеяться на то, что никто не догадается так сделать - это глупая надежда.
Не нужно изобретать велосипед - всё уже изобретено в БД. Определитесь с ролями: гость, менеджер, админ, начальник. Создайте для этих ролей свои наборы из GRANT и при создании пользователя пользуйтесь эти готовыми шаблонами ролей. Это намного удобней, безопасней и правильней, чем ваши доморощенные процедуры проверки.
Тут немного другое
Дело в том, что мне нужно распределить привилегии на уровне записей, а не на уровне строк, что невозможно просто созданием ролей для пользователя
Записи = строки, что-то вы
Записи = строки, что-то вы путаете.
Да, на уровне строк таблицы привилегии раздать невозможно, но как правило и не нужно.
В противном случае вам понадобится запрещать всё всем, затем делать для работы с записями функции, которые будут проверять привилегии и без помощи которых доступа к данным нет ни у кого. Если записей в таблице много - это жуткие тормоза и обломинго оптимизатору, поэтому делать так можно (по моему мнению) только на очень небольших таблицах.