Членство в ролях
Эта страница переведена при помощи нейросети GigaChat.
Удобно объединить пользователей в группы для упрощения управления правами доступа. В PostgreSQL это реализуется созданием особой роли, символизирующей группу, и добавлением в нее отдельных пользовательских ролей в качестве участников.
Для начала нужно создать саму групповую роль:
CREATE ROLE name;
Чаще всего групповые роли создаются без атрибута LOGIN
, хотя при необходимости его можно установить самостоятельно.
После создания групповой роли можно свободно добавлять и удалять ее участников с помощью команд GRANT
и REVOKE
:
GRANT group_role TO role1, ... ;
REVOKE group_role FROM role1, ... ;
Членство можно предоставлять не только индивидуальным ролям, но и другим групповым ролям (так как разницы между ними формально нет). Система не допускает образования циклических зависимостей между ролями и запрещает давать членство группе PUBLIC
.
Пользователи, входящие в состав групповой роли, могут использовать ее привилегии двумя путями:
- Явно временно стать данной ролью, исполнив команду
SET ROLE
. В таком случае текущий сеанс приобретает права выбранной роли, а не оригинальной пользовательской роли. Все объекты, созданные в данном состоянии, принадлежат групповой роли, а не изначальной роли пользователя. - Пользователи, чьи роли наделены атрибутом
INHERIT
, автоматически получают доступ к правам групповой роли, включая любые наследуемые привилегии самой группы. Например, предположим следующую последовательность шагов:
CREATE ROLE joe LOGIN;
CREATE ROLE admin;
CREATE ROLE wheel;
CREATE ROLE island;
GRANT admin TO joe WITH INHERIT TRUE;
GRANT wheel TO admin WITH INHERIT FALSE;
GRANT island TO joe WITH INHERIT TRUE, SET FALSE;
После подключения под ролью joe
сеанс получит доступ к прямым привилегиям роли joe
, а также к привилегиям роли admin
, так как joe
наследует их от admin
. Однако привилегии роли wheel
останутся недоступны, поскольку членство в ней для joe
организовано через посредника (admin
), имеющего атрибут NOINHERIT
. После выполнения команды:
SET ROLE admin;
сеанс получит доступ только к привилегиям, предоставляемым ролью admin
, но не к тем, что закреплены за ролью joe
. После выполнения команды:
SET ROLE wheel;
сеанс будет располагать только привилегиями, выделенными роли wheel
, игнорируя привилегии, назначенные ролям joe
и admin
. Вернуться к исходному состоянию можно, выполнив одну из следующих команд:
SET ROLE joe;
SET ROLE NONE;
RESET ROLE;
Команда SET ROLE
позволяет перейти в любую роль, в которую входит текущая роль, будь то прямое или косвенное членство при условии, что существует цепочка членства в ролях, каждая из которых имеет атрибут SET TRUE
(установленный по умолчанию). Поэтому в примере выше не обязательно сначала становиться admin
перед тем как стать wheel
. С другой стороны, стать island
не получится вовсе, а joe
может получить доступ к правам только через механизм наследования.
Стандарт SQL четко разделяет понятия «пользователь» и «роль»: пользователи не наследуют привилегии автоматически, в отличие от ролей. В PostgreSQL подобное поведение достижимо назначением атрибутов: ролям, выступающим в роли SQL-групп, дается атрибут INHERIT
, а пользовательским ролям — атрибут NOINHERIT
. Однако по умолчанию PostgreSQL присваивает всем ролям атрибут INHERIT
ради совместимости с ранними версиями (до 8.1), где пользователи автоматически использовали привилегии назначенных им групп.
Атрибуты ролей, такие как LOGIN
, SUPERUSER
, CREATEDB
и CREATEROLE
, можно считать особыми привилегиями, но они не наследуются подобно обычным привилегиям на объекты базы данных. Для активации этих атрибутов необходимо явно выполнить команду SET ROLE
для соответствующей роли. Продолжая предыдущий пример, можно предоставить привилегии CREATEDB
и CREATEROLE
роли admin
. Тогда пользователь, подключившийся под ролью joe
, не получит эти привилегии автоматически, а только после перехода в роль admin
командой SET ROLE admin
.
Для удаления групповой роли используется команда DROP ROLE
:
DROP ROLE name;
При удалении групповой роли автоматически отменяются все ассоциации членства в ней, однако сами участники остаются неизмененными.