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

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

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

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

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

CREATE ROLE name;

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

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

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

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

Члены ролевой группы могут использовать привилегии роли двумя способами. Во-первых, роли-члены, которым было предоставлено членство с опцией SET, могут выполнить 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 и island, потому что joe наследует эти привилегии. Однако привилегии, предоставленные wheel, недоступны, потому что, хотя joe косвенно является членом wheel, членство осуществляется через admin, которому было предоставлено с использованием WITH INHERIT FALSE. После:

SET ROLE admin;

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

SET ROLE wheel;

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

SET ROLE joe;
SET ROLE NONE;
RESET ROLE;

Примечание

Команда SET ROLE всегда позволяет выбрать любую роль, членом которой исходная роль входа является прямо или косвенно, при условии, что существует цепочка предоставлений членства, каждое из которых имеет SET TRUE (что является значением по умолчанию). Таким образом, в приведенном выше примере нет необходимости становиться admin перед тем, как стать wheel. С другой стороны, невозможно стать island вообще; joe может получить доступ к этим привилегиям только через наследование.

Примечание

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

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

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

DROP ROLE name;

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