21.3. Членство в роли#

21.3. Членство в роли

21.3. Членство в роли

Часто удобно группировать пользователей вместе для упрощения управления привилегиями: таким образом, привилегии могут быть предоставлены или отозваны для всей группы. В Tantor SE это делается путем создания роли, которая представляет группу, а затем предоставления членства в роли группы отдельным пользователям.

Для настройки групповой роли сначала создайте роль:

CREATE ROLE name;

Обычно роль, используемая в качестве группы, не имеет атрибута LOGIN, хотя вы можете его установить, если хотите.

После создания групповой роли вы можете добавлять и удалять участников с помощью команд GRANT и REVOKE:

GRANT group_role TO role1, ... ;
REVOKE group_role FROM role1, ... ;

Вы также можете назначать членство в других групповых ролях (поскольку на самом деле нет различия между групповыми ролями и негрупповыми ролями). База данных не позволит вам создавать циклические петли членства. Кроме того, нельзя назначать членство в роли PUBLIC.

Члены групповой роли могут использовать привилегии роли двумя способами. Во-первых, каждый член группы может явно выполнить SET ROLE, чтобы временно стать групповой ролью. В этом состоянии сессия базы данных имеет доступ к привилегиям групповой роли, а не к исходной роли входа, и любые созданные объекты базы данных считаются принадлежащими групповой роли, а не роли входа. Во-вторых, роли-члены, имеющие атрибут INHERIT, автоматически получают использование привилегий ролей, членами которых они являются, включая любые привилегии, унаследованные этими ролями. В качестве примера, предположим, что мы сделали:

CREATE ROLE joe LOGIN INHERIT;
CREATE ROLE admin NOINHERIT;
CREATE ROLE wheel NOINHERIT;
GRANT admin TO joe;
GRANT wheel TO admin;

Сразу после подключения в качестве роли joe, сессия базы данных будет иметь права, предоставленные непосредственно joe, а также любые права, предоставленные admin, потому что joe наследует права admin. Однако права, предоставленные wheel, недоступны, потому что, хотя joe является косвенным членом wheel, членство происходит через admin, который имеет атрибут NOINHERIT. После:

SET ROLE admin;

сессия будет иметь доступ только к привилегиям, предоставленным пользователю admin, а не тем, которые предоставлены пользователю joe. После:

SET ROLE wheel;

сессия будет иметь доступ только к тем привилегиям, которые были предоставлены wheel, и не тем, которые были предоставлены joe или admin. Исходное состояние привилегий может быть восстановлено с помощью любого из:

SET ROLE joe;
SET ROLE NONE;
RESET ROLE;

Примечание

Следующий пример демонстрирует, что команда SET ROLE всегда позволяет выбрать любую роль, в которую исходная роль входит непосредственно или косвенно. Таким образом, в приведенном выше примере нет необходимости становиться admin перед тем, как стать wheel.

Примечание

В стандарте SQL существует четкое различие между пользователями и ролями, и пользователи не наследуют привилегии автоматически, в то время как роли наследуют. Это поведение можно получить в Tantor SE, предоставив ролям, используемым в качестве SQL-ролей, атрибут INHERIT, в то время как ролям, используемым в качестве SQL-пользователей, атрибут NOINHERIT. Однако, по умолчанию Tantor SE предоставляет всем ролям атрибут INHERIT для обратной совместимости с предыдущими версиями до 8.1, в которых пользователи всегда имели права, предоставленные группам, членами которых они были.

Все атрибуты роли LOGIN, SUPERUSER, CREATEDB и CREATEROLE можно рассматривать как особые привилегии, но они никогда не наследуются как обычные привилегии на объекты базы данных. Чтобы воспользоваться этими атрибутами, вам действительно нужно выполнить команду SET ROLE для конкретной роли, имеющей один из этих атрибутов. Продолжая приведенный выше пример, мы можем выбрать предоставить роли admin привилегии CREATEDB и CREATEROLE. Затем сессия, подключенная в качестве роли joe, не будет иметь эти привилегии сразу, только после выполнения команды SET ROLE admin.

Чтобы удалить групповую роль, используйте DROP ROLE:

DROP ROLE name;

Любые членства в роли группы автоматически аннулируются (но членские роли в остальном не затрагиваются).