A free and open-source book on ZF3 for beginners

Translation into this language is not yet finished. You can help this project by translating the chapters and contributing your changes.

17.2. Introducción a RBAC

ZF3 provee un componente especial llamado Zend\Permissions\Rbac que implementa un contenedor para roles y permisos.

Para instalar el componente Zend\Permissions\Rbac en nuestra aplicación web, escribimos el siguiente comando.

php composer.phar require zendframework/zend-permissions-rbac

17.2.1. Roles y permisos

Un rol es un grupo de usuario. Por ejemplo, en una aplicación de Blog pueden existir los siguientes roles: Espectador, Autor, Editor y Administrador.

Tabls 17.1. Ejemplo de roles para un Blog
Nombre del roles Descripción
Viewer Solo puede leer cualquier publicación.
Author Puede ver las publicaciones y además crear una publicación, editarla y publicarla.
Editor Puede ver las publicaciones y además editar y publicar cualquier publicación.
Administrator Puede hacer todo lo que puede hacer un Viewer y un Editor y además puede borrar las publicaciones.

Un usuario puede ser asignado a uno o varios roles de una vez. Por ejemplo, el usuario John puede ser un Viewer y un Editor al mismo tiempo.

Un rol puede heredar permisos de otros roles. En otras palabras, los roles se pueden organizar en una jerarquía en donde los roles padres heredan permisos de los roles hijos. Por ejemplo, en un Blog, el rol Administrator podría heredar permisos del rol Editor (ver figura 17.1 más abajo). Esto es porque el rol Administrator puede hacer las mismas cosas que el Editor y además borrar publicaciones. Los roles Editor y Author podrían heredar permisos del role Viewer.

Figura 17.1 Jerarquía de roles un un Blog Figura 17.1 Jerarquía de roles un un Blog

A un rol se le pueden asignar varios permisos. Un permiso es un sola acción típica en el sistema. Aquí hay varios ejemplos de permisos en un Blog:

Tabla 17.2. Ejemplo de permisos en un Blog
Nombre del permiso Descripción
post.view Ver cualquier publicación.
post.edit Editar cualquier publicación.
post.own.edit Editar solo las publicaciones de las que se es dueño.
post.publish Publicar cualquier publicación.
post.own.publish Publicar solo las publicaciones de las que se es dueño.
post.delete Borrar cualquier publicación.

Por ejemplo, al rol Viewer se le puede asignar el permiso post.view. El rol Editor puede tener los permisos post.edit y post.publish. El role Author podría tener los permisos post.own.edit y post.own.publish. Y el rol Administrator tendría asignado el permiso post.delete.

17.2.2. Contenedor RBAC

En ZF3, podemos usar la clase Rbac que vive en el espacio de nombres Zend\Permissions\Rbac como un contenedor simple para nuestros roles y permisos. Con este contenedor, guardamos nuestros roles en memoria organizados en una jerarquía y con permisos asignados.

Por ejemplo, vamos a crear un contenedor Rbac para el Blog y lo llenaremos con roles y permisos:

use Zend\Permissions\Rbac\Rbac;

// Create Rbac container.
$rbac = new Rbac();

// The following is to tell Rbac to create some parent roles if not exist yet
$rbac->setCreateMissingRoles(true);

// Create role hierarchy
$rbac->addRole('Viewer', ['Editor', 'Author']);
$rbac->addRole('Editor', ['Administrator']);
$rbac->addRole('Author');
$rbac->addRole('Administrator');

// Assign permissions to the Viewer role.
$rbac->getRole('Viewer')->addPermission('post.view');

// Assign permissions to the Author role.
$rbac->getRole('Author')->addPermission('post.own.edit');
$rbac->getRole('Author')->addPermission('post.own.publish');

// Assign permissions to the Editor role.
$rbac->getRole('Editor')->addPermission('post.edit');
$rbac->getRole('Editor')->addPermission('post.publish');

// Assign permissions to the Administrator role.
$rbac->getRole('Administrator')->addPermission('post.delete');

Como podemos ver, un role se agrega al contenedor Rbac con la ayuda del método addRole(). El método addRole() toma dos argumentos: el nombre del rol que se creará y el nombre o los nombres de su o sus roles padres. Si los roles padres no existen aún, ellos se crean automáticamente (con este propósito usamos el método setCreateMissingRoles()).

Los permisos se asignan al role creado con la ayuda del método de role addPermission().

17.2.3. Revisar permisos

Cuando tenemos el contenedor Rbac configurado podemos consultar si el rol tiene determinado permiso con el método isGranted(), de la siguiente manera:

// The following will return false, because the Viewer can't delete posts
$rbac->isGranted('Viewer', 'post.delete');

// The following will return true, because admins can delete posts
$rbac->isGranted('Administrator', 'post.delete');

El método isGranted() revisa el role y su hijos y busca el permiso dado. Si encuentra el permiso regresa true de lo contrario regresa false.


Top