MariaDB comenzando con 10.0.5

Los roles se introdujeron en MariaDB 10.0.5.

Descripción

Un rol agrupa varios privilegios. Ayuda a organizaciones más grandes donde, por lo general, varios usuarios tendrían los mismos privilegios y, anteriormente, la única forma de cambiar los privilegios de un grupo de usuarios era cambiando los privilegios de cada usuario individualmente.

Alternativamente, se podría haber asignado el mismo usuario a varios usuarios externos y no habría habido forma de ver qué usuario real era responsable de qué acción.

Con los roles, gestionar esto es fácil. Por ejemplo, podría haber varios usuarios asignados a un rol de periodista, con privilegios idénticos. Cambiar los privilegios de todos los periodistas es una cuestión de simplemente cambiar los privilegios de la función, mientras que el usuario individual todavía está vinculado con los cambios que se produzcan.

Los roles se crean con la instrucción CREATE ROLE y se eliminan con la instrucción DROP ROLE. Luego, los roles se asignan a un usuario con una extensión de la declaración GRANT, mientras que los privilegios se asignan a un rol de la forma habitual con GRANT. De manera similar, la instrucción REVOKE se puede utilizar tanto para revocar un rol de un usuario como para revocar un privilegio de un rol.

Una vez que un usuario se ha conectado, puede obtener todos los privilegios asociados con un rol al configuración un rol con la instrucción SET ROLE. La función CURRENT_ROLE devuelve el rol establecido actualmente para la sesión, si lo hubiera.

Solo se pueden establecer los roles otorgados directamente a un usuario, los roles otorgados a otros roles no. En cambio, los privilegios otorgados a un rol, que a su vez se otorga a otro rol (beneficiario), estarán inmediatamente disponibles para cualquier usuario que establezca este segundo rol de beneficiario.

Los roles fueron implementados como un proyecto GSoC 2013 por Vicentiu Ciorbaru.

MariaDB comenzando con 10.1.1

La instrucción SET DEFAULT ROLE permite establecer un rol predeterminado para un usuario. Un rol predeterminado se habilita automáticamente cuando un usuario se conecta (una instrucción SET ROLE implícita se ejecuta inmediatamente después de que se establece una conexión).

Tablas del sistema

La información sobre los roles y a quién se les ha otorgado se puede encontrar en la tabla Esquema de información APPLICABLE_ROLES, así como en la tabla mysql.ROLES_MAPPING.

La tabla del esquema de información ENABLED_ROLES muestra los roles habilitados para la sesión actual.

Ejemplos de

Crear un rol y otorgar un privilegio:

CREATE ROLE journalist;GRANTSHOWDATABASESON*.*TO journalist;GRANT journalist to hulda;

Tenga en cuenta que Hulda no tiene SHOW DATABASES privilegio, a pesar de que se le concedió el papel de periodista. Ella necesita colocar el papel primero:

SHOWDATABASES;+--------------------+|Database|+--------------------+| information_schema |+--------------------+SELECT CURRENT_ROLE;+--------------+| CURRENT_ROLE |+--------------+|NULL|+--------------+SET ROLE journalist;SELECT CURRENT_ROLE;+--------------+| CURRENT_ROLE |+--------------+| journalist   |+--------------+SHOWDATABASES;+--------------------+|Database|+--------------------+|...|| information_schema || mysql              || performance_schema || test               ||...|+--------------------+SET ROLE NONE;

Se pueden otorgar roles a roles:

CREATE ROLE writer;GRANTSELECTONdata.*TO writer;GRANT writer TO journalist;

Pero no es necesario establecer un rol otorgado a un rol. Por ejemplo, hulda obtendrá automáticamente todos los privilegios de escritora cuando establezca el rol de periodista:

SELECT CURRENT_ROLE;+--------------+| CURRENT_ROLE |+--------------+|NULL|+--------------+SHOWTABLESFROMdata;
Empty set(0.01 sec)SET ROLE journalist;SELECT CURRENT_ROLE;+--------------+| CURRENT_ROLE |+--------------+| journalist   |+--------------+SHOWTABLESFROMdata;+------------------------------+| Tables_in_data               |+------------------------------+| set1                         ||...|+------------------------------+

Funciones y vistas (y rutinas almacenadas)

Cuando un usuario establece un rol, en cierto sentido, tiene dos identidades con dos conjuntos de privilegios asociados. Pero una vista (o una rutina almacenada) solo puede tener un definidor. Entonces, cuando se crea una vista (o una rutina almacenada) con el SQL SECURITY DEFINER, se puede especificar si el definidor debe ser CURRENT_USER (y la vista no tendrá ninguno de los privilegios del rol del usuario) o CURRENT_ROLE (en este caso, la vista usará los privilegios del rol, pero ninguno de los privilegios del usuario). Como resultado, a veces se puede crear una vista que es imposible de usar.

CREATE ROLE r1;GRANTALLON db1.*TO r1;GRANT r1 TO foo@localhost;GRANTALLON db.*TO foo@localhost;SELECTCURRENT_USER+---------------+|current_user|+---------------+| foo@localhost|+---------------+SET ROLE r1;CREATETABLE db1.t1 (i int);CREATEVIEW db.v1 ASSELECT*FROM db1.t1;SHOWCREATEVIEW db.v1;+------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+|View|CreateView| character_set_client | collation_connection |+------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+| v1   |CREATEALGORITHM=UNDEFINEDDEFINER=`foo`@`localhost`SQL SECURITY DEFINERVIEW`db`.`v1`ASSELECT`db1`.`t1`.`i`AS`i`from`db1`.`t1`| utf8                 | utf8_general_ci      |+------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+CREATEDEFINER=CURRENT_ROLE VIEW db.v2 ASSELECT*FROM db1.t1;SHOWCREATEVIEW db.b2;+------+-----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+|View|CreateView| character_set_client | collation_connection |+------+-----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+| v2   |CREATEALGORITHM=UNDEFINEDDEFINER=`r1`SQL SECURITY DEFINERVIEW`db`.`v2`ASselect`db1`.`t1`.`a`AS`a`from`db1`.`t1`| utf8                 | utf8_general_ci      |+------+-----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+

Otros recursos

El contenido reproducido en este sitio es propiedad de sus respectivos dueños, y MariaDB no revisa este contenido con anticipación. Los puntos de vista, la información y las opiniones expresadas por este contenido no representan necesariamente las de MariaDB o de cualquier otra parte.