O Zend ACL atende às minhas necessidades?

Baseei meu aplicativo no Zend Framework. estou usandoZend_Auth para autenticação, mas não tenho certeza seZend_Acl funcionará para mim porque, francamente, os exemplos que vi são simplistas demais para minhas necessidades ou me confundem.

Estou pensando em elementos no meu aplicativo como Recursos e esses Recursos podem ter Privilégios. As funções que contêm privilégios de recurso são definidas dinamicamente e atribuídas aos usuários. Estou armazenando essas informações em tabelas normalizadas.

Os usuários têm uma funçãoUma função pode ter vários recursosOs recursos podem ter vários privilégios

Funções são realmente apenas coleções de privilégios de recursos sem hierarquia. Um exemplo de um Recurso seria 'Página'. Todos podem ver as páginas, mas um usuário autenticado precisaria de privilégios de 'adicionar', 'editar' ou 'excluir' para fazer qualquer outra coisa com as páginas.

Isso combina com o Zend ACL? Estou pensando em ACL de maneira a criar problemas para mim?

Minha solução

Typeonerror recebe o crédito, mas aqui está a minha solução específica.

Eu estendiZend_Acl para simplificar meu uso porque apenas carrego a função do usuário atual:

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 preencher a ACL, executo uma consulta que retornaresource, privilegeerole_id colunas. orole_id A coluna é nula no conjunto de resultados se a função do usuário não tiver esse privilégio.

$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']);
    }
}

questionAnswers(1)

yourAnswerToTheQuestion