Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Jow Xavier

[Resolvido] Módulo SITE e ADMIN

Recommended Posts

Tenho um site onde existe um painel para o cliente se logar e ver seus dados, e também existe uma área administrativa para gerenciar o site, em ambos é necessário fazer o acesso "login", os dados são consultados em tabelas diferentes, mas uma vez que estou logado no ADMIN automaticamente me logo no SITE, e quando me logo no SITE automaticamente me logo no ADMIN, ou seja consigo me logar nos dois módulos mesmo sem ter acesso a um. Dessa forma deixando o meu SITE vulnerável, pois clientes que se logam no SITE, ficam com acesso no ADMIN ... Preciso resolver isso e não estou encontrando solução!!!

 

Acesso ao ADMIN

 

           $dbAdapter = Zend_Db_Table::getDefaultAdapter();
           //Inicia o adaptador Zend_Auth para banco de dados
           $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
           $authAdapter->setTableName('tb_usuarios')
                                   ->setIdentityColumn('login')
                                   ->setCredentialColumn('senha');
           //Define os dados para processar o login
           $authAdapter->setIdentity($login)
                                   ->setCredential($senha);
           //Efetua o login
           $auth = Zend_Auth::getInstance();
           $result = $auth->authenticate($authAdapter);
           //Verifica se o login foi efetuado com sucesso
           if ($result->isValid()):
               //Armazena os dados do usuário em sessão, apenas desconsiderando
               //a senha do usuário
               $info = $authAdapter->getResultRowObject(null, 'senha');
               $storage = $auth->getStorage();
               $storage->write($info);
               //Redireciona para o Controller protegido
               $this->_redirect('admin/usuario/index');
           else:
               //Dados inválidos
               $msg = "Login/Senha não conferem";
               $this->_helper->flashMessenger->addMessage(array('success' => $msg));  
               $this->_redirect('admin');
           endif;
       endif;
   }

 

Acesso ao SITE

 

          $dbAdapter = Zend_Db_Table::getDefaultAdapter();
           //Inicia o adaptador Zend_Auth para banco de dados
           $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
           $authAdapter->setTableName('tb_cadastros')
                                   ->setIdentityColumn('email')
                                   ->setCredentialColumn('senha');
           //Define os dados para processar o login
           $authAdapter->setIdentity($email)
                                   ->setCredential($senha);
           //Efetua o login
           $auth = Zend_Auth::getInstance();
           $result = $auth->authenticate($authAdapter);
           //Verifica se o login foi efetuado com sucesso
           if ($result->isValid()):
               //Armazena os dados do usuário em sessão, apenas desconsiderando
               //a senha do usuário
               $info = $authAdapter->getResultRowObject(null, 'senha');
               $storage = $auth->getStorage();
               $storage->write($info);

               $authNamespace = new Zend_Session_Namespace('Zend_Auth');
               $authNamespace->user = $this->usuario->nome;

               //Redireciona para o Controller protegido
               $this->_redirect('cadastro/index');
           else:
               //Dados inválidos
               $msg = "Login/Senha não conferem";
               $this->_helper->flashMessenger->addMessage(array('success' => $msg));  
               $this->_redirect('cadastro/login');
           endif;
       endif;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tem duas opções para resolver isso!!

 

1º Zend_Acl:

$acl->addRole(new Zend_Acl_Role('admin'), 'administrador');
$acl->addRole(new Zend_Acl_Role('user'), 'usuarios');
$acl->addResource(new Zend_Acl_Resource('paginas'));
$acl->addResource(new Zend_Acl_Resource('noticias'));

$acl->allow('admin', array('paginas'));
$acl->allow('usuarios', array('noticias'));

 

Depos só testar:

 

$acl->isAllowed();

 

2º Definindo uma regra para tratamento:

$authAdapter->setTableName('tb_usuarios') // caso seja tabelas diferentes
            ->setIdentityColumn('login')  
            ->setCredentialColumn('senha')
            ->setCredentialTreatment("grupo == 'administrador' "); //Você pode melhorar a segurança usando o "salt"

 

 

De qualquer forma o você terá que usar os dois exemplos acima, o exemplo dois só irá validar o login e o exemplo dois vai validar se o cara pode estar ali ou não.

 

Ainda existe uma outra alternativa, mas você terá que fazer bastante mudança que é usando varias instancias do Zend_Auth.

 

Qualquer coisa se precisar posso ajudar você fazer essa alteração.

 

AAA o exemplo de para o uso do salt :D

 

.......
->setCredentialTreatment("SHA1(CONCAT(?,salt)) AND grupo == 'administrador'");

//Notando que o item salt é uma coluna na sua tabela com uma chave
// O Resultado disso será : SHA1(MinhaSenha+uanhdwo2oi12no1in2o12n);
// Final: 3293f06f70e551b2edab8607ae8b75b90a5f6321

Compartilhar este post


Link para o post
Compartilhar em outros sites

nessa pagina que vc verifica o login vc pode fazer assim:

 

troque

$auth = Zend_Auth::getInstance();

 

por

$auth = Zend_Auth::getInstance()->setStorage(new Zend_Auth_Storage_Session('Admin'));

 

e na pagina SITE faça mesma coisa:

$auth = Zend_Auth::getInstance()->setStorage(new Zend_Auth_Storage_Session('Site'));

 

com isso o Zend separa sua instancia de login

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela ajuda, o exemplo é basicamente o que eu já faço "login", então para resolver este controle de módulos terei que usar Zend_Acl ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

No Exemplo que o Fabyo falou você já vai resolver duma vez, essa é a terceira opção que eu avia falado acima.

 

Mas o Zend_Acl é recomendado você ter, pois ele ira validar o seu acesso! Crie um Plugin e inicialize ele no seu Bootstrap fazendo as verificações necessárias.

 

 

Login ADMIN:

 


$dbAdapter = Zend_Db_Table::getDefaultAdapter();
           //Inicia o adaptador Zend_Auth para banco de dados
           $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
           $authAdapter->setTableName('tb_usuarios')
                                   ->setIdentityColumn('login')
                                   ->setCredentialColumn('senha');
           //Define os dados para processar o login
           $authAdapter->setIdentity($login)
                                   ->setCredential($senha);
           //Efetua o login
           $auth = Zend_Auth::getInstance()->setStorage(new Zend_Auth_Storage_Session('Administrador')); // ALTERADO
           $result = $auth->authenticate($authAdapter);
           //Verifica se o login foi efetuado com sucesso
           if ($result->isValid()):
               //Armazena os dados do usuário em sessão, apenas desconsiderando
               //a senha do usuário
               $info = $authAdapter->getResultRowObject(null, 'senha');
               $storage = $auth->getStorage();
               $storage->write($info);
               //Redireciona para o Controller protegido
               $this->_redirect('admin/usuario/index');
           else:
               //Dados inválidos
               $msg = "Login/Senha não conferem";
               $this->_helper->flashMessenger->addMessage(array('success' => $msg));  
               $this->_redirect('admin');
           endif;
       endif;
   }

 

Login Site:

 

$dbAdapter = Zend_Db_Table::getDefaultAdapter();
           //Inicia o adaptador Zend_Auth para banco de dados
           $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
           $authAdapter->setTableName('tb_cadastros')
                                   ->setIdentityColumn('email')
                                   ->setCredentialColumn('senha');
           //Define os dados para processar o login
           $authAdapter->setIdentity($email)
                                   ->setCredential($senha);
           //Efetua o login

           $auth = Zend_Auth::getInstance()->setStorage(new Zend_Auth_Storage_Session('Site')); // ALTERADO
           $result = $auth->authenticate($authAdapter);
           //Verifica se o login foi efetuado com sucesso
           if ($result->isValid()):
               //Armazena os dados do usuário em sessão, apenas desconsiderando
               //a senha do usuário
               $info = $authAdapter->getResultRowObject(null, 'senha');
               $storage = $auth->getStorage();
               $storage->write($info);

               $authNamespace = new Zend_Session_Namespace('Zend_Auth');
               $authNamespace->user = $this->usuario->nome;

               //Redireciona para o Controller protegido
               $this->_redirect('cadastro/index');
           else:
               //Dados inválidos
               $msg = "Login/Senha não conferem";
               $this->_helper->flashMessenger->addMessage(array('success' => $msg));  
               $this->_redirect('cadastro/login');
           endif;
       endif;

Compartilhar este post


Link para o post
Compartilhar em outros sites

nessa pagina que você verifica o login você pode fazer assim:

 

troque

$auth = Zend_Auth::getInstance();

 

por

$auth = Zend_Auth::getInstance()->setStorage(new Zend_Auth_Storage_Session('Admin'));

 

e na pagina SITE faça mesma coisa:

$auth = Zend_Auth::getInstance()->setStorage(new Zend_Auth_Storage_Session('Site'));

 

com isso o Zend separa sua instancia de login

 

Dessa forma não está nem logando mais, preciso fazer algo no index.php ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Depois de alterar não consigo mais me logar, segue os dados alterado ...

 

Zend_Loader :: loadClass('Zend_Auth_Storage_Session');
$auth = Zend_Auth::getInstance()->setStorage(new Zend_Auth_Storage_Session('admin')); 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Onde você faz a validação precisa ser definido qual sessão ele ira verificar.

 

Mas a validação não é aki:

$auth = Zend_Auth::getInstance()->setStorage(new Zend_Auth_Storage_Session('admin'));

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não! Ali você esta criando a autenticação!

Agora você precisa de alguém que vai ficar verificando se existe uma sessão de autenticação criada.

 

/**
* @return boolean
*/
Zend_Auth::getInstance("admin")->hasIdentity();

 

 

Mas a validação não é aki:

$auth = Zend_Auth::getInstance()->setStorage(new Zend_Auth_Storage_Session('admin'));

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que parece voce criou apenas uma pagina de login com a validação, se for isso mesmo

 

suas paginas nao ficam protegidas, pois acessando as paginas diretamente sem logar deve acessar.

 

para resolver isso voce precisa criar um plugin de validação do login, assim todas as paginas ficariam protegidas, sem voce precisa incluir nada em nenhuma dela

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que parece voce criou apenas uma pagina de login com a validação, se for isso mesmo

 

suas paginas nao ficam protegidas, pois acessando as paginas diretamente sem logar deve acessar.

 

para resolver isso voce precisa criar um plugin de validação do login, assim todas as paginas ficariam protegidas, sem voce precisa incluir nada em nenhuma dela

 

Não consegue acessar sem logar! pois no controller tenho essa verificação

 

   public function init(){
       if (!Zend_Auth::getInstance()->hasIdentity()):
           $msg = "Favor efetuar login";
           $this->_helper->flashMessenger->addMessage(array('success' => $msg));  
           $this->_redirect('admin');
       else:
           $usuario = Zend_Auth::getInstance()->getIdentity();
           $this->view->usuario = $usuario;
       endif;
   }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Da forma que você esta fazendo para validar você esta verificando somente um controller!

 

Para criar a validação você precisa usar o plugin.

 

Exemplo:

 

class Biblioteca_Auth_Validacao extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{

	$auth = Zend_Auth::getInstance();

	if (!$auth->hasIdentity())
	{
                       //Local que será exibido caso ele não esta logado!
		$request->setModuleName('default')
				->setControllerName('login')
				->setActionName('index');

		$requisicao = array("Você não está logado!!!!!");
	}
	else
	{
		$requisicao = array("Você está logado com sucesso: " . Zend_Auth::getInstance()->getIdentity()->email);	
	}

	//Teste, apagar depois se for usar isso!
	Zend_Debug::dump($requisicao);
}
}

 

Bootstrap:

 

   protected function _initFrontController ()
   {
       $front = Zend_Controller_Front::getInstance();
       $front->registerPlugin(new Biblioteca_Auth_Validacao());
       return $front;
   }

 

Não consegue acessar sem logar! pois no controller tenho essa verificação

 

   public function init(){
       if (!Zend_Auth::getInstance()->hasIdentity()):
           $msg = "Favor efetuar login";
           $this->_helper->flashMessenger->addMessage(array('success' => $msg));  
           $this->_redirect('admin');
       else:
           $usuario = Zend_Auth::getInstance()->getIdentity();
           $this->view->usuario = $usuario;
       endif;
   }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entao é ai que você tem que colocar o codigo que te passei

 

O que estou dizendo é que essa alteração

 

$auth = Zend_Auth::getInstance()->setStorage(new Zend_Auth_Storage_Session('admin'));

 

Não me deixa mais logar, mesmo com os dados corretos ... Mas se eu fizer

 

//Efetua o login
           $auth = Zend_Auth::getInstance();
           //$auth = Zend_Auth::getInstance()->setStorage(new Zend_Auth_Storage_Session('admin'));
           $result = $auth->authenticate($authAdapter);
           //Verifica se o login foi efetuado com sucesso
           if ($result->isValid()):
               //Armazena os dados do usuário em sessão, apenas desconsiderando
               //a senha do usuário
               $info = $authAdapter->getResultRowObject(null, 'senha');
               $storage = $auth->setStorage(new Zend_Auth_Storage_Session('admin'));
               //$storage->write($info);
               //Redireciona para o Controller protegido
               $this->_redirect('admin/usuario/index');
           else:
               //Dados inválidos
               $msg = "Login/Senha não conferem";
               $this->_helper->flashMessenger->addMessage(array('success' => $msg));  
               $this->_redirect('admin');
           endif;

 

Consigo me logar, e mostra bem vindo usuário -> "login", e no site não mostra. OK funciona, mas dessa forma não tenho todas as informações do usuário logado como tinha antes.

 

E no init

 

   public function init(){
       $usuario = Zend_Auth::getInstance("admin")->getIdentity();
       $this->view->usuario = $usuario;        
    }

 

Nessa variável $usuario tenho apenas a informação do primeiro campo que é o login.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom estou tentando resolver aqui, mas caso eu não eu consiga conto com a ajuda de vocês!

 

Por isso que lá em cima na minha primeira resposta eu falei que dava um pouco mais de trabalho.

 

Mas faz assim eu to no escritório ainda quando chega em casa eu faço um exemplo completo!!

 

Se puder fazer isso será de grande ajuda, pois é o q falta para finalizar este projeto ... obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exemplo Finalizado!!!

 

Link Github: https://github.com/tiarebalbi/ZfExampleAuth

 

Informações Complementares:

Eu realizei a implementação apenas do login com duas instancias! A parte de verificação eu coloco depois que acabo não dando tempo!

 

Da uma olhada no codigo! A Class que realiza a validação esta dentro de Library/Biblioteca

 

 

O que ficou faltando para você foi o código abaixo pois como a você estava trabalhando com os storage, o framework precisava identificar qual sessão ele ia abrir. Segue o exemplo abaixo:

 


$dados = Zend_Auth::getInstance()->setStorage(new Zend_Auth_Storage_Session('admin'));

$this->view->usuario = $dados->getIdentity();

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exemplo Finalizado!!!

 

Link Github: https://github.com/tiarebalbi/ZfExampleAuth

 

Informações Complementares:

Eu realizei a implementação apenas do login com duas instancias! A parte de verificação eu coloco depois que acabo não dando tempo!

 

Da uma olhada no codigo! A Class que realiza a validação esta dentro de Library/Biblioteca

 

 

O que ficou faltando para você foi o código abaixo pois como a você estava trabalhando com os storage, o framework precisava identificar qual sessão ele ia abrir. Segue o exemplo abaixo:

 


$dados = Zend_Auth::getInstance()->setStorage(new Zend_Auth_Storage_Session('admin'));

$this->view->usuario = $dados->getIdentity();

 

Opá desculpe pela demora tava resolvendo outra coisa aqui. Acabei de ver o seu código, mas me parece bem avançado para quem está apenas começando com Zend Framework ... Não existe uma solução baseada no que eu já tenho pronto "login"? No seu primeiro post você sugeriu usar Zend_Acl que é uma coisa que eu devo usar, me parece a forma correta então gostaria que você me sugerisse um tutorial.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.