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
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.
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.
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:
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
.
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()
.
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
.