Bienvenidos sean a este post, hoy veremos como asignar permisos mediante roles.
Como se daran cuenta manejar usuarios no es tan dificil pero siempre y cuando sean pocos pero que sucederia si tenemos una gran cantidad de usuarios? Vamos a suponer que tenemos una gran cantidad de usuarios con unos permisos determinados y con el tiempo debemos modificar los accesos a estos usuarios, esto seria una gran molestia pero aqui entran en accion los roles, a partir de la version 10.0 se los introdujo segun la especificacion SQL2003:
Si un conjunto de instrucciones pueden ser introducidas en un rol, este rol puede ser asociado a un conjunto de cuentas
El Tinchicus
Esta asociacion entre cuentas y roles nos permitira tener un mejor control sobre los permisos dado que ahora mariadb no verifica los permisos en la cuenta sino los que tiene el rol al cual se le asigno a la cuenta, por lo tanto si hacemos algun cambio en la base solo debemos actualizar a los roles y no a las cuentas, veamos primero el comando para crear roles:
CREATE [OR REPLACE] ROLE [IF NOT EXISTS] nombre_rol
[WITH ADMIN {CURRENT_USER | CURRENT_ROLE | usuario | nombre_rol}]
Al igual que vimos en el post anterior el REPLACE es opcional para reemplazarlo en caso de que exista y el IF NOT EXISTS que solo lo crea si no existe, en ambos casos sera para evitar errores, con la opcion WITH ADMIN determinamos si el usuario actual (CURRENT_USER), el rol actual (CURRENT_ROLE), el usuraio o el rol seran los encargados de garantizar el acceso a dicho rol, veamos un ejemplo:
MariaDB [(none)]> create role revisador;
Con esto podemos crear un rol simple llamado revisador que por el momento no tiene permisos pero mas adelante veremos como establecerlos, veamos el caso donde creamos un nuevo rol para otro usuario:
create role escritor with admin user01;
Pasemos a ver como asignar permisos al rol, para ello volveremos a usar a GRANT pero lo usaremos de una forma muy particular, veamos un ejemplo con el rol revisador:
MariaDB [(none)]> grant select on base1.tabla3 to revisador;
En este caso le damos solamente el permiso de SELECT sobre una tabla especifica, ahora asignemos un usuario a ese rol:
MariaDB [(none)]> grant revisador to user01;
Como pueden ver es muy simple, simplemente pasamos el rol y el usuario pero podemos asignar todos los que sean necesarios e inclusive podemos asignar otros roles a este rol como miembros, con esto ya hemos concedido los permisos probemos con una nueva conexion con el usuario que agregamos al rol y probemos de ejecutar un query:
MariaDB [(none)]> select * from base1.tabla3;
ERROR 1142 (42000): SELECT command denied to user 'user01'@'localhost' for table 'tabla3'
MariaDB [(none)]>
Como pueden ver nos devolvio un error, y se estaran preguntando porque no funciono si ya tenemos los permisos? Esto es debido a que los roles no se aplican automaticamente, para ello debemos usar el siguiente comando:
MariaDB [(none)]> set role revisador;
Como solamente podemos usar un solo rol debemos usarlo de esta forma, si necesitamos mas de un rol podemos agregar esos roles como dijimos anteriormente, probemos de ejecutar el query ahora:
MariaDB [(none)]> select * from base1.tabla3;
+----+----------+----------+----------------------+------+------------+
| id | nombre | apellido | correo | edad | ciudad |
+----+----------+----------+----------------------+------+------------+
| 5 | Martin | Miranda | tinchicus@gmail.com | 45 | Dunwich |
| 6 | Enzo | Tortore | elgary@tinchicus.com | 33 | Dunwich |
| 7 | DarkZero | Aleman | darkie@tinchicus.com | 32 | Miskatonic |
| 8 | Ariel | Polizzi | eltio@tinchicus.com | 47 | Arkham |
| 16 | John | Doe | thebiggerdickonthist | 23 | New York |
+----+----------+----------+----------------------+------+------------+
5 rows in set (0.000 sec)
MariaDB [(none)]>
Como pueden ver ahora funciono correctamente, vamos a ver el comando que nos muestra los roles aplicables:
MariaDB [(none)]> select * from information_schema.applicable_roles;
+----------+-----------+--------------+------------+
| GRANTEE | ROLE_NAME | IS_GRANTABLE | IS_DEFAULT |
+----------+-----------+--------------+------------+
| user01@% | escritor | YES | NO |
| user01@% | revisador | NO | NO |
+----------+-----------+--------------+------------+
2 rows in set (0.001 sec)
MariaDB [(none)]>
Nota: El resultado puede variar dependiendo de la cantidad de roles
Observen como tenemos el rol donde fuimos agregado (revisador) y el que creamos y lo agregamos como admin (escritor), en este caso nos podemos dar cuenta por la columna IS_GRANTABLE si figura como YES seremos ADMIN y con NO somos miembro de este, veamos el siguiente comando:
MariaDB [(none)]> select * from information_schema.enabled_roles;
+-----------+
| ROLE_NAME |
+-----------+
| revisador |
+-----------+
1 row in set (0.001 sec)
MariaDB [(none)]>
En este caso nos devolvera los roles que tenemos activados, por ultimo para saber cual es nuestro rol actual debemos usar el siguiente comando:
MariaDB [(none)]> select current_role();
Por ultimo para eliminar un rol debemos usar el siguiente comando:
DROP ROLE [IF EXISTS] nombre_rol[, nombre_rol] ...
Este es el comando mas simple donde la opcion IF EXISTS es para lo mismo de siempre, elimina el rol solo si existe de lo contrario devuelve un aviso en lugar de un error, obligatoriamente debemos pasar un nombre de rol y de forma opcional todos los necesarios, veamos un ejemplo:
MariaDB [(none)]> drop role revisador;
En resumen, hoy hemos visto roles, que son, como trabajan, para que sirven, como podemos implementarlo, sus distintas opciones, y una serie de ejemplos donde podemos verlo en practica, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
