Anuncios

Bienvenidos sean a este post, hoy veremos como asignar permisos mediante roles.

Anuncios
Anuncios

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
Anuncios

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}]
Anuncios

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;
Anuncios

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;
Anuncios

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;
Anuncios

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;
Anuncios

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)]>
Anuncios

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;
Anuncios

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)]>
Anuncios

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)]>
Anuncios
Nota: 
El resultado puede variar dependiendo de la cantidad de roles
Anuncios

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)]>
Anuncios

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();
Anuncios

Por ultimo para eliminar un rol debemos usar el siguiente comando:

DROP ROLE [IF EXISTS] nombre_rol[, nombre_rol] ...
Anuncios

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;
Anuncios

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.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50