anterior  
índice  
siguiente  
Updated 2012-10-02 - Version ZF 2.0.3

Perfeccionamiento de los controles de acceso

Definir mejor los controles de acceso

El ACL básico según lo definido en la sección anterior demuestra cómo los diversos privilegios se pueden otorgar sobre todo el ACL (todos los recursos). En la práctica, sin embargo, los controles de acceso tienden a tener excepciones y diversos grados de complejidad. Zend\Permissions\Acl permite lograr estos refinamientos de una manera sencilla y flexible.

Para el CMS del ejemplo se ha determinado que, si bien el grupo ‘staff’ cubre las necesidades de la gran mayoría de usuarios, hay una necesidad de un nuevo grupo ‘marketing’ que requiere el acceso al boletín de noticias y las últimas noticias en el CMS. El grupo es bastante auto suficiente y tendrá la capacidad de publicar y de archivar los boletines de noticias y las últimas noticias.

Primero revisamos el registro del rol para reflejar estos cambios. Hemos determinado que el grupo ‘marketing’ tiene los mismos permisos básicos que ‘staff’, así que definimos ‘marketing’ de tal manera que herede los permisos de ‘staff’:

1
2
 // El nuevo grupo de Marketing hereda los permisos de Staff
 $acl->addRole(new Zend\Permissions\Acl\Role\GenericRole('marketing'), 'staff');

A continuación, la nota que por encima de los controles de acceso se refieren a recursos específicos (por ejemplo, “boletín informativo”, “últimas noticias”, “anuncio de noticias”). Ahora añadimos estos recursos:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// Crear recursos para las reglas
 // newsletter
 $acl->addResource(new Zend\Permissions\Acl\Resource\GenericResource('newsletter'));

 // news
$acl->addResource(new Zend\Permissions\Acl\Resource\GenericResource('news'));

 // Últimas Noticias
$acl->addResource(new Zend\Permissions\Acl\Resource\GenericResource('latest'), 'news');

 // anuncio de noticias
$acl->addResource(new Zend\Permissions\Acl\Resource\GenericResource('announcement'), 'news');

Entonces es simplemente una cuestión de la definición de estas normas más específicas en ámbitos de la ACL:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
 //
 Marketing debe ser capaz de archivar y publicar boletines informativos y
 // las últimas noticias
 $acl->allow('marketing',
 array('newsletter', 'latest'),
 array('publish', 'archive'));

 // Staff (y marketing, por herencia), se le denega el permiso a
 // revisar las últimas noticias
 $acl->deny('staff', 'latest', 'revise');

 // Todos (incluyendo los administradores) tienen permiso denegado para
 // archivar anuncios y noticias
 $acl->deny(null, 'announcement', 'archive');

Ahora podemos consultar el ACL con respecto a los últimos cambios:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
 "allowed" : "denied";
 // denegado

 echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
 "allowed" : "denied";
 // permitido

 echo $acl->isAllowed('staff', 'latest', 'publish') ?
 "allowed" : "denied";
 // denegado

 echo $acl->isAllowed('marketing', 'latest', 'publish') ?
 "allowed" : "denied";
 // permitido

 echo $acl->isAllowed('marketing', 'latest', 'archive') ?
 "allowed" : "denied";
 // permitido

 echo $acl->isAllowed('marketing', 'latest', 'revise') ?
 "allowed" : "denied";
 // denegado

 echo $acl->isAllowed('editor', 'announcement', 'archive') ?
 "allowed" : "denied";
 // denegado

 echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
 "allowed" : "denied";
 // denegado

Eliminar los controles de acceso

Para eliminar una o más reglas ACL, simplemente utilice el método removeAllow() o removeDeny(). Al igual que con allow() y deny(), puede utilizar un valor NULL para indicar que el método es aplicable a todos los roles, recursos y/o privilegios:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Elimina la prohibición de leer las últimas noticias de staff (y marketing,
// por herencia)
$acl->removeDeny('staff', 'latest', 'revise');

echo $acl->isAllowed('marketing', 'latest', 'revise') ?
 "allowed" : "denied";
// permitido

// Elimina la autorización para publicar y archivar los boletines
// marketing
$acl->removeAllow('marketing',
                  'newsletter',
                  array('publish', 'archive'));

echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
     "allowed" : "denied";
// denegado

echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
"allowed" : "denied";

// denegado

Los privilegios pueden ser modificados de manera incremental como se ha indicado anteriormente, pero un valor NULL para los privilegios anula tales cambios incrementales:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
//Permitir al grupo de "marketing" todos los permisos a las últimas noticias
$acl->allow('marketing', 'latest');

echo $acl->isAllowed('marketing', 'latest', 'publish') ?
"allowed" : "denied";
//permitido

echo $acl->isAllowed('marketing', 'latest', 'archive') ?
"allowed" : "denied";
//permitido

echo $acl->isAllowed('marketing', 'latest', 'anything') ?
"allowed" : "denied";
// permitido
|

Contenidos

Tema anterior

Introducción

Próximo tema

Uso Avanzado

Esta página

Nota: Es necesario estar conectado a tu cuenta GitHub para contribuir a la documentación.

Edit this document

Edit this document

The source code of this file is hosted on GitHub. Everyone can update and fix errors in this document with few clicks - no downloads needed.

  1. Login with your GitHub account.
  2. Go to Perfeccionamiento de los controles de acceso on GitHub.
  3. Edit file contents using GitHub's text editor in your web browser
  4. Fill in the Commit message text box at the end of the page telling why you did the changes. Press Propose file change button next to it when done.
  5. On Send a pull request page you don't need to fill in text anymore. Just press Send pull request button.
  6. Your changes are now queued for review under project's Pull requests tab on GitHub.