Обзор ролей
Описание
Роль объединяет несколько привилегий. Она полезна для крупных организаций, где, как правило, у нескольких пользователей одинаковые привилегии, а ранее единственным способом изменения привилегий для группы пользователей было изменение привилегий каждого пользователя индивидуально.
В альтернативном варианте нескольким внешним пользователям можно было назначить одного и того же пользователя, и не было способа узнать, какой конкретный пользователь был ответственен за какое действие.
С ролями управление этим становится простым. Например, может быть несколько пользователей, назначенных на роль журналиста, с идентичными привилегиями. Изменение привилегий для всех журналистов сводится к простому изменению привилегий роли, при этом отдельный пользователь по-прежнему связан с любыми изменениями, которые происходят.
Роли создаются с помощью оператора СОЗДАТЬ РОЛЬ, и удаляются с помощью оператора УДАЛИТЬ РОЛЬ. Затем роли назначаются пользователю с помощью расширения оператора НАДЕЛЕНИЕ, в то время как привилегии назначаются роли обычным способом с помощью оператора НАДЕЛЕНИЕ. Аналогичным образом, оператор ОТМЕНА может использоваться как для отмены роли у пользователя, так и для отмены привилегии у роли.
После подключения пользователь может получить все привилегии, связанные с ролью, установив роль с помощью оператора УСТАНОВИТЬ РОЛЬ. Функция CURRENT_ROLE возвращает текущую установленную роль для сеанса, если она есть.
Устанавливаться могут только роли, предоставленные непосредственно пользователю, роли, предоставленные другим ролям, устанавливаться нельзя. Вместо этого привилегии, предоставленные роли, которая, в свою очередь, предоставлена другой роли (получатель), будут сразу доступны любому пользователю, который установит эту вторую роль получателя.
Оператор УСТАНОВИТЬ ПОЛЬЗОВАТЕЛЬСКУЮ РОЛЬ позволяет установить пользовательскую роль по умолчанию. Роль по умолчанию автоматически включается при подключении пользователя (неявный оператор УСТАНОВИТЬ РОЛЬ выполняется сразу после установления подключения).
Роли были реализованы как проект GSoC 2013 года Викентием Киорбару.
Системные таблицы
Информация о ролях и тем, кому они были предоставлены, может быть найдена в таблице Справочник системы APPLICABLE_ROLES, а также в таблице mysql.ROLES_MAPPING.
Таблица Справочник системы ENABLED_ROLES показывает включенные роли для текущего сеанса.
Примеры
Создание роли и предоставление привилегии:
CREATE ROLE journalist; GRANT SHOW DATABASES ON *.* TO journalist; GRANT journalist to hulda;
Обратите внимание, что у hulda нет SHOW DATABASES привилегии, даже несмотря на то, что ей была предоставлена роль журналиста. Сначала ей нужно установить роль:
SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | +--------------------+ SELECT CURRENT_ROLE; +--------------+ | CURRENT_ROLE | +--------------+ | NULL | +--------------+ SET ROLE journalist; SELECT CURRENT_ROLE; +--------------+ | CURRENT_ROLE | +--------------+ | journalist | +--------------+ SHOW DATABASES; +--------------------+ | Database | +--------------------+ | ... | | information_schema | | mysql | | performance_schema | | test | | ... | +--------------------+ SET ROLE NONE;
Роли могут предоставляться ролям:
CREATE ROLE writer; GRANT SELECT ON data.* TO writer; GRANT writer TO journalist;
Но устанавливать роль, предоставленную роли, не нужно. Например, hulda автоматически получит все привилегии писателя, когда установит роль журналиста:
SELECT CURRENT_ROLE; +--------------+ | CURRENT_ROLE | +--------------+ | NULL | +--------------+ SHOW TABLES FROM data; Empty set (0.01 sec) SET ROLE journalist; SELECT CURRENT_ROLE; +--------------+ | CURRENT_ROLE | +--------------+ | journalist | +--------------+ SHOW TABLES FROM data; +------------------------------+ | Tables_in_data | +------------------------------+ | set1 | | ... | +------------------------------+
Роли и представления (и хранимые процедуры)
Когда пользователь устанавливает роль, он, в некотором смысле, имеет две личности с двумя соответствующими наборами привилегий. Но представление (или хранимая процедура) может иметь только одного определяющего. Таким образом, когда представление (или хранимая процедура) создается с SQL SECURITY DEFINER, можно указать, должен ли определяющий быть CURRENT_USER (и представление не будет иметь никаких привилегий роли пользователя) или CURRENT_ROLE (в этом случае представление будет использовать привилегии роли, но не привилегии пользователя). В результате иногда можно создать представление, которое невозможно использовать.
CREATE ROLE r1; GRANT ALL ON db1.* TO r1; GRANT r1 TO foo@localhost; GRANT ALL ON db.* TO foo@localhost; SELECT CURRENT_USER +---------------+ | current_user | +---------------+ | foo@localhost | +---------------+ SET ROLE r1; CREATE TABLE db1.t1 (i int); CREATE VIEW db.v1 AS SELECT * FROM db1.t1; SHOW CREATE VIEW db.v1; +------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | View | Create View | character_set_client | collation_connection | +------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | v1 | CREATE ALGORITHM=UNDEFINED DEFINER=`foo`@`localhost` SQL SECURITY DEFINER VIEW `db`.`v1` AS SELECT `db1`.`t1`.`i` AS `i` from `db1`.`t1` | utf8 | utf8_general_ci | +------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ CREATE DEFINER=CURRENT_ROLE VIEW db.v2 AS SELECT * FROM db1.t1; SHOW CREATE VIEW db.b2; +------+-----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | View | Create View | character_set_client | collation_connection | +------+-----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | v2 | CREATE ALGORITHM=UNDEFINED DEFINER=`r1` SQL SECURITY DEFINER VIEW `db`.`v2` AS select `db1`.`t1`.`a` AS `a` from `db1`.`t1` | utf8 | utf8_general_ci | +------+-----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
Другие ресурсы
- Обзор ролей Петра Гульцуана
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/roles_overview/