Ir para conteúdo

POWERED BY:

Arquivado

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

[VAZA]

[Resolvido] Zend_Auth - Autenticação por modulo

Recommended Posts

Pessoal,

no meu site eu tenho a parte administrativa e a default.

Acontece que quando eu me logo na parte administrativa, o mesmo valor de autenticação fica sendo utilizado tanto para a parte administrativa como para a default.

Eu gostaria de separar isso. Como eu posso estar fazendo isso?

Segue abaixo meu cód de autenticação pelo Zend_Auth.

A unica diferença para o outro módulo, é que ao inves de puxar da entidade de clientes, puxa da entidade de funcionários.

 

 

function loginAction()
	{
		
		$this->_helper->removeHelper('viewRenderer');
		$this->_helper->layout->disableLayout();
		
		$clientes = new Clientes();		
		
		if($this->getRequest()->isPost())
		{		
			$auth = Zend_Auth::getInstance();

			$filter = new Zend_Filter_StripTags();
			$login = $filter->filter($this->_request->getPost('login'));
			$senha = $filter->filter($this->_request->getPost('senha'));
			
			$authAdapter = new Zend_Auth_Adapter_DbTable($clientes->getAdapter(), 'clientes');
			$authAdapter->setIdentityColumn('login')
						->setCredentialColumn('senha');
			$authAdapter->setIdentity($login)
						->setCredential($senha);
			$result = $auth->authenticate($authAdapter);

			if($result->isValid())
			{			
				$clientes = new Clientes();
				$regCliente = $clientes->fetchRow("login = '".$login."'");
				
				$storage = new Zend_Auth_Storage_Session();
				$data = $authAdapter->getResultRowObject();
	
				$data->idcliente = $regCliente->idcliente;							
				$storage->write($data);		
				$this->_redirect('index');
			}
			else
			{					
				
				echo "<script language='javascript'>alert('Login/senha Invalido(s)');</script>";
				echo "<script language='javascript'>self.location = 'index';</script>";
				//$this->view->msg = 'Login/Senha invalido(s).';
			}
									
		}
		
	}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom vamos por partes antes de mais nada gostaria de dar umas dicas no seu codigo

 

a primeira dica é simples você esta estanciando 2 vezes a classe Clientes e nao precisa apenas 1 ja resolve

 

outra coisa eu percebi que você esta pegando a getAdapter atraves do metodo da classe cliente, nao precisa fazer assim

e nem precisa carregar a classe cliente no caso do login.

 

vou postar uma parte do meu sistema de login tem algumas linhas que você pode eliminar vendo meu codigo da pra enxugar um pouco o seu:

 

obs: apaguei algumas coisas deixando só a parte que interessa

 

<?php

class LoginController extends Zend_Controller_Action
{
public function logarAction()
{
	if (!($this->_request->isPost())) $this->_redirect('/');

	try {
		$filter = new Zend_Filter();
		$filter->addFilter( new Zend_Filter_StringTrim())
			   ->addFilter( new Zend_Filter_StripTags())
			   ->addFilter( new Zend_Filter_Alnum());

		$nome  = $filter->filter($this->_request->getPost('nome'));
		$senha = $filter->filter($this->_request->getPost('senha'));

		$config = Zend_Registry::get('config');
		$db	 = Zend_Db::factory($config->database);

		$authAdapter = new Zend_Auth_Adapter_DbTable($db);
		$authAdapter->setTableName("Usuarios")
					->setIdentityColumn("Login")
					->setCredentialColumn("Senha")
					->setCredentialTreatment('MD5(?)')
					->setIdentity($nome)
					->setCredential($senha);

		$result = Zend_Auth::getInstance()->authenticate($authAdapter);

		$db->closeConnection();

		switch ($result->getCode()) {
			case Zend_Auth_Result::SUCCESS:
				$data = $authAdapter->getResultRowObject(null, "Senha");
				if($data->Nivel_Acesso > 0){
					Zend_Auth::getInstance()->getStorage()->write($data);
					$log_txt = 	"Login|$nome|".date("Y-m-d H:i:s");
					$log_xml->log($log_txt, Zend_Log::INFO);
					$mensagem = "{success:true, dados: {code: '0', usuario:'".ucfirst(strtolower($nome))."'}}";
				} else {
					Zend_Auth::getInstance()->clearIdentity();
					$log_txt = 	"Aguardando liberação|$nome|".date("Y-m-d H:i:s");
					$log_xml->log($log_txt, Zend_Log::INFO);
					$mensagem = "{success:false, dados: {code: '1'}}";
				}
				break;
			case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:
				$log_xml->log('Erro Usuario nao cadastrado!!!', Zend_Log::WARN);
				$mensagem = "{success:false, dados: {code: '2'}}";
				break;
			case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
				$log_xml->log('Erro senha errada!!!', Zend_Log::WARN);
				$mensagem = "{success:false, dados: {code: '3'}}";
				break;
		}
	} catch (Zend_Db_Adapter_Exception $e) {
		$mensagem = "{success:false, dados: {code: '4'}}";
		$log_xml->log($e->getMessage(), Zend_Log::WARN);
	} catch (Zend_Exception $e) {
		$mensagem = "{success:false, dados: {code: '5'}}";
		$log_xml->log($e->getMessage(), Zend_Log::WARN);
	}
	$this->getResponse()->clearBody();
	$this->getResponse()->setHeader('Content-Type', 'text/x-json; charset=iso-8859-1');
	$this->getResponse()->setBody($mensagem);
}

function logoutAction()
{
	Zend_Registry::_unsetInstance();
	Zend_Auth::getInstance()->clearIdentity();
	$this->_redirect('/');
}
}

 

nao sei se percebeu nao estanciei a classe new Zend_Auth_Storage_Session eu usei assim:

Zend_Auth::getInstance()->getStorage()->write($data);

 

com esse comando $authAdapter->getResultRowObject(null, "Senha"); eu pego todos os dados da tabela ignorando o campo senha

 

e no lugar de:

$auth = Zend_Auth::getInstance();
$result = $auth->authenticate($authAdapter);

 

eu usei:

$result = Zend_Auth::getInstance()->authenticate($authAdapter);

 

use e abuse dos recursos do Zend = )

 

bom agora sobre a sua duvida eu trabalho com um plugin SecurityPlugin.php e nele facilmente da pra fazer o que você quer, basicamente é você testar se o usuario esta logado, e depois testar o modulo se o usuario nao tiver acesso aquele modulo você manda ele pra tela de login desse modulo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Fabyo.

 

Desculpe voltar ao tópico depois de tanto tempo.

Estou fazendo um sistema e uso o ZF. Tem uns 5 dias que venho quebrando a cabeça com a classe Zend_Auth.

Facilitou muito seguir o exemplo acima.

 

Mas tive uma dúvida no ponto:

$data->Nivel_Acesso > 0

 

...que veio de:

$data = $authAdapter->getResultRowObject(null, "Senha");

 

O que isso retornaria? Entendi que verifica as permissões do usuário, mas não entendi o que o getResultRowObject(null, "Senha") faz.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

GustavoBK,

getResultRowObject(null, 'Senha');
retornará um array com todas a colunas menos o a coluna Senha.

 

Supondo que você tenha.

 

tabela_clientes

id

email

nome

password

 

getResultRowObject(null, 'password');

retornaria

Array
(
    [id] => 1
    [email] => email
    [nome] => nome
)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Excelente!

 

Valeu!

 

Tentarei mexer com isso mais a frente pois estou implementando outra parte do sistema.

Até maio venho tirar mais dúvidas!

 

Abraço.

Gustavo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Minha duvida é a seguinte.

 

Como recupero os dados que o codigo abaixo guardou?

 

Zend_Auth::getInstance()->getStorage()->write($data);

 

Quero recupera-lo para usar posteriormente.

 

 

//Assim:
echo Zend_Auth::getInstance->getStorage()->read()->email;

//ou assim:
$dados = Zend_Auth::getInstance->getStorage()->read();
echo $dados->nome;
echo $dados->email; 

// obs.: não tem como pegar a senha - por causa do getResultRowObject(null, 'Senha');
echo $dados->senha; // NULL

Compartilhar este post


Link para o post
Compartilhar em outros sites

$Auth = Zend_Auth::getInstance()->getIdentity();

 

então mas caso meu usuario altere seus dados...

 

eu teria que gravar ou alterar os dados de identidade dele correto?!

 

como eu faço isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Geralmente os dados de login numa sessao, sao usados para manter o usuario logado, mas se voce for fazer alguma alteração que influencie no uso do sistema exemplo mudar o nivel de acesso, voce pode forçar o logout, para o cara ter que logar novamente

Compartilhar este post


Link para o post
Compartilhar em outros sites

Geralmente os dados de login numa sessao, sao usados para manter o usuario logado, mas se voce for fazer alguma alteração que influencie no uso do sistema exemplo mudar o nivel de acesso, voce pode forçar o logout, para o cara ter que logar novamente

 

então não existe forma de alterar os dados da sessão do zend_auth, sem que eu tenha que fazer o login novamente, no caso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Da sim, basta você usar:

 

Zend_Registry::_unsetInstance();

 

e criar a sessao novamente com os dados novos

 

Zend_Auth::getInstance()->getStorage()->write($data);

 

só lembrando que para manter o padrao tem que salvar os dados da classe e nao somente um simples array

Compartilhar este post


Link para o post
Compartilhar em outros sites

Da sim, basta você usar:

 

Zend_Registry::_unsetInstance();

e criar a sessao novamente com os dados novos

 

Zend_Auth::getInstance()->getStorage()->write($data);

só lembrando que para manter o padrao tem que salvar os dados da classe e nao somente um simples array

 

vou te encomodar so mais uma vez antes do jogo hehe

 

na minha autenticação tem opção para o usuário lembrar a o login

 

Zend_Session::rememberMe(604800);

 

ou

 

Zend_Session::forgetMe();

 

caso o usuário tenha marcado opção para lembrar o login tem como eu saber isso?

 

muito obrigado pela ajuda!

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.