Re: [pgsql-ru-general] Re[2]: [pgsql-ru-general] Роли: управление доступом к другим ролям. Роли как объекты системы безопасности. - Mailing list pgsql-ru-general

From silly_sad
Subject Re: [pgsql-ru-general] Re[2]: [pgsql-ru-general] Роли: управление доступом к другим ролям. Роли как объекты системы безопасности.
Date
Msg-id 486CCE9A.3070004@bankir.ru
Whole thread Raw
In response to Re[2]: [pgsql-ru-general] Роли: управление доступом к другим ролям. Роли как объекты системы безопасности.  (sftf <sftf-misc@mail.ru>)
List pgsql-ru-general
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 функции, которая основываясь на данных о
привилегиях либо создаёт для вас юзера либо не создаёт.

Разумеется функций будет не одна и их можно зацепить за триггеры.
и вообще расширить систему прав КАК ПОЖЕЛАЕТЕ.

pgsql-ru-general by date:

Previous
From: sftf
Date:
Subject: Re: [pgsql-ru-general] Re: [pgsql-ru-general] Re[2]: [pgsql-ru-general] Роли: управление доступом к другим ролям. Роли как объекты системы безопасности.
Next
From: sftf
Date:
Subject: Re: [ADMIN] Re: Rewrite SELECT WHERE clause on per-session bases. Modifing view source code in one session (user's) from another session (admin's)?