Zend_Acl
-
Upload
rhemsolutions -
Category
Technology
-
view
1.672 -
download
0
description
Transcript of Zend_Acl
Resumen Zend_Acl
del manual de zend(02/09/2010)
Introducción
Zend_Acl provee una ligera y flexible implementación de lista de control de acceso (ACL).
resource: Es un objeto al cual el acceso es controlado.role: Es un objeto que puede solicitar acceso a un recurso.
Resources
Zend_Acl ofrece Zend_Acl_Resource que es una básica implementación de su interfaz Zend_Acl_Resource_Interface.
Zend_Acl ofrece una estructura de arbol al cual multiples recursos pueden ser agregados.
Por ejemplo. se puede asignar permiso a cada casa de una ciudad o simplemente asignar permiso a toda la ciudad.
Un recurso solo puede heredar de un recurso padre y este a su vez de su padre.
Roles
Zend_Acl ofrece Zend_Acl_Role que es una básica implementación de su interfaz Zend_Acl_Role_Interface.
En Zend_Acl un rol puede heredar de uno o mas padres.
Por ejemplo un rol "sally" puede pertenecer a uno o mas roles padre como "editor" y "administrador".
El desarrollador puede asignar permisos al "editor" y "administrador" separadamente y "sally" heredará los permisos de ambos roles sin necesidad de asignar permisos directamente a "sally".
Heredar de varios Roles$acl = new Zend_Acl();$acl->addRole(new Zend_Acl_Role('guest')) ->addRole(new Zend_Acl_Role('member')) ->addRole(new Zend_Acl_Role('admin'));
$parents = array('guest', 'member', 'admin');//si $parents tiene un solo elemento 'guest' se puede usar//$acl->addRole(new Zend_Acl_Role('someUser'), 'guest');$acl->addRole(new Zend_Acl_Role('someUser'), $parents);
$acl->add(new Zend_Acl_Resource('someResource'));//se puede usar $acl->allow('member', null); tiene permiso a todos los recursos$acl->deny('guest', 'someResource');$acl->allow('member', 'someResource');
echo $acl->isAllowed('someUser', 'someResource') ? 'allowed' :'denied';
Heredar de varios Roles
Puesto que no se asigno directamente a "someUser" permiso a "someResource" entonces Zend_Acl busca los permisos de los roles padre de "someUser".
$parents = array('guest', 'member', 'admin'); ...$acl->deny('guest', 'someResource');$acl->allow('member', 'someResource');
Primero el rol admin es evaluado=>no se le asigno permisoLuego el rol member es evaluado=>si tiene permisoLuego hace un Break.
El orden del array $parents es muy importante.
Consultando permisos
Si un rol tiene permisos asignados$acl->deny('guest', 'someResource');$acl->allow('member', 'someResource',array('add', 'edit'));
echo $acl->isAllowed('guest', 'someResource') ? 'allowed' :'denied';//imprime denied
echo $acl->isAllowed('
member', 'someResource', 'add') ? "allowed" : "denied";//imprime allowed
Quitando permisos
$acl->removeDeny('guest', 'someResource');$acl->removeAllow('member', 'someResource','add');
Guardando permisos
Zend_Acl es serializable con la funcion de PHP's » serialize()
y la cadena resultante se puede guardar en un archivo, en una base de datos, donde sea.
Permisos Condicionales
Algunas veces permitir el acceso a un recurso puede depender de varios criterios. Por ejemplo si se desea restringir el acceso a un determinado recurso solo entre las 8:30am y 5:30pm.Otro ejemplo seria denegar el acceso a un recurso si la IP entrante ha sido marcado como una fuente de abuso.
Zend_Acl tiene soporte para permisos permisos condicionales con su interfaz Zend_Acl_Assert_Interface del cual el desarrollador debe implementar el metodo assert()
Permisos Condicionales
class CleanIPAssertion implements Zend_Acl_Assert_Interface{ public function assert(Zend_Acl $acl, Zend_Acl_Role_Interface $role = null, Zend_Acl_Resource_Interface $resource = null, $privilege = null) { return $this->_isCleanIP($_SERVER['REMOTE_ADDR']); } protected function _isCleanIP($ip) { // ...debe retornar true o false }}
Permisos Condicionales
$acl = new Zend_Acl();$acl->allow(null, null, null, new CleanIPAssertion());