He basado mi aplicación en Zend Framework. Estoy usando Zend_Auth
para la autenticación, pero no estoy seguro de si Zend_Acl
me funcionará porque, francamente, los ejemplos que he visto son demasiado simplistas para mis necesidades o me confunden.¿Zend ACL se adapta a mis necesidades?
Estoy pensando en elementos en mi aplicación como Recursos y estos Recursos pueden tener privilegios. Las funciones que contienen privilegios de recursos se definen dinámicamente y se asignan a los usuarios. Estoy almacenando esta información en tablas normalizadas.
- Los usuarios tienen un papel
- Un papel puede tener múltiples recursos
- Los recursos pueden tener múltiples privilegios
papeles son en realidad sólo colecciones de los privilegios de recursos con ninguna jerarquía. Un ejemplo de un recurso sería 'Página'. Todos pueden ver las páginas, pero un usuario autenticado necesitaría privilegios de 'agregar', 'editar' o 'eliminar' para hacer cualquier otra cosa con las páginas.
¿Esta malla con Zend ACL? ¿Estoy pensando en ACL de una manera que me va a crear problemas?
mi solución
Typeonerror se lleva el crédito, pero aquí está mi solución específica.
extendí Zend_Acl
para simplificar el uso de mi porque yo sólo carga el papel del usuario actual:
class My_Acl extends Zend_Acl
{
protected $_role_id;
public function setRole($role_id)
{
$this->_role_id = $role_id;
return $this->addRole($role_id);
}
public function getRole()
{
return $this->_role_id;
}
public function deny($resource, $privilege)
{
return parent::deny($this->_role_id, $resource, $privilege);
}
public function allow($resource, $privilege)
{
return parent::allow($this->_role_id, $resource, $privilege);
}
public function isAllowed($resource, $privilege)
{
return parent::isAllowed($this->_role_id, $resource, $privilege);
}
}
para poblar la ACL ejecuto una consulta que devuelve resource
, privilege
y role_id
columnas. La columna role_id
es nula en el conjunto de resultados si la función del usuario no tiene ese privilegio.
$acl = new My_Acl();
$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
$userInfo = $auth->getStorage()->read();
$acl->setRole($userInfo->role_id);
} else {
$acl->setRole('');
}
// QUERY HERE
foreach ($privileges as $privilege) {
if (!$acl->has($privilege['resource'])) {
$acl->addResource($privilege['resource']);
}
if (is_null($privilege['role_id'])) {
$acl->deny($privilege['resource'], $privilege['privilege']);
} else {
$acl->allow($privilege['resource'], $privilege['privilege']);
}
}
Estoy viendo los niveles de Usuario, Rol y Recurso en su ejemplo. Tengo usuario, función, recurso, privilegio. Un Usuario tiene un Rol, un Rol puede tener múltiples Recursos, y un Recurso puede tener múltiples Privilegios. ¿Estoy malentendiendo algo en tu solución? – Sonny
Suena bien. La forma en que los usuarios están configurados, cada usuario hereda los privilegios de su padre.Entonces "admin" obtiene todos los privilegios de "invitado" y "miembros". Bajo administración, dejo "todo" y luego niego la acción de "purga" en todos los recursos y denego la acción "crear" solo en el recurso "cms: comentarios". Entonces todavía pueden acceder a las acciones "cms: comments-> view" o "cms: comments-> moderate". – typeoneerror
Agregó un código. – typeoneerror