/** * Creates an ACL for a specific user * @param stdClass $usuario - usuario logado, recebido do Zend_Auth * @return Core_Acl */ public static function createAcl($usuario) { //Lets assume we have a model for the page_privileges with a method like this //which would return PagePrivilege objects with the page_id passed as the param. $privilegios_unidade = DaoPrivilegio::getPrivilegiosPorUnidade((int) $usuario->ID_UNIDADE); $privilegios_usuario = DaoPrivilegioUsuario::getPrivilegiosPorUsuario((int) $usuario->ID); $acl = new Core_Acl(); $acl->addRole(new Zend_Acl_Role($usuario->ID)); $acl->setIdUnidade($usuario->ID_UNIDADE); $acl->setNomeUnidade($usuario->DIRETORIA); $acl->setTrocouUnidade($usuario->TROCOU ? true : false); foreach ($privilegios_unidade as $privilege) { $recurso = DaoRecurso::getRecursoById($privilege['ID_RECURSO']); if (!$acl->has($recurso)) { $acl->addResource($recurso); } // Checa pela presenca de assertion if ($recurso->hasClasseAssertion()) { $acl->allow($usuario->ID, $recurso, null, new $recurso->classe_assertion()); } else { if ($privilege['PERMISSAO'] == 1) { $acl->allow($usuario->ID, $recurso); } else { $acl->deny($usuario->ID, $recurso); } } } foreach ($privilegios_usuario as $privilege2) { $recurso = DaoRecurso::getRecursoById($privilege2['ID_RECURSO']); // @todo foi adicionado a condicao !NULL para corrigir possivel bug, analizar! if (!is_null($recurso) && !$acl->has($recurso)) { $acl->addResource($recurso); } // @todo foi adicionado a condicao !NULL para corrigir possivel bug, analizar! // Checa pela presenca de assertion if (!is_null($recurso) && $recurso->hasClasseAssertion()) { $acl->allow($usuario->ID, $recurso, null, new $recurso->classe_assertion()); } else { if ($privilege2['PERMISSAO'] == "1") { $acl->allow($usuario->ID, $recurso); } else { $acl->deny($usuario->ID, $recurso); } } } if ($acl->isTrocouUnidade()) { $acl->allow($usuario->ID, 115); } return $acl; }
/** * @return controlar */ private function _prepareAcl() { if (!is_null($this->usuario) && !is_null($this->usuario->ID_UNIDADE)) { // atualizar informações da unidade do usuário na sessão // com as informações do banco, a menos que o usuário tenha trocado // Testar a existência de um cache de acl para o usuário if (!$this->cache->test('acl_' . $this->usuario->ID)) { $this->acl = AclFactory::createAcl($this->usuario); $this->cache->save($this->acl, 'acl_' . $this->usuario->ID, array('acl_usuario_' . $this->usuario->ID, 'acl_unidade_' . $this->usuario->ID_UNIDADE)); } else { $this->acl = $this->cache->load('acl_' . $this->usuario->ID); if ($this->usuario->ID_UNIDADE != $this->acl->getIdUnidade()) { if (!$this->acl->isTrocouUnidade() && !$this->usuario->TROCOU) { // id do cache e da session não batem, e usuário não trocou de unidade // limpar o cache e recriá-lo $this->cache->remove('acl_' . $this->usuario->ID); $this->cache->clean('matchingAnyTag', array('acl_usuario_' . $this->usuario->ID)); $this->acl = AclFactory::createAcl($this->usuario); $this->cache->save($this->acl, 'acl_' . $this->usuario->ID, array('acl_usuario_' . $this->usuario->ID, 'acl_unidade_' . $this->usuario->ID_UNIDADE)); // limpar } } $this->usuario = $this->acl->updateSession(); } // Forçar permissão de troca de unidades pro usuário que já trocou de unidade if ($this->acl->isTrocouUnidade()) { $this->acl->allow($this->usuario->ID, 115); } } return $this; }