Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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;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
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 ?
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;>
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 ?
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'));Onde você faz a validação precisa ser definido qual sessão ele ira verificar.
>
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'));
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'));
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
>
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;
}Entao é ai que vc tem que colocar o codigo que te passei
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;
}>
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.
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!! :)
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
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();>
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.
Sem problema,então eu encontrei um tutorial, caso você não entenda algo ai avisa que eu monto um outro exemplo aqui.
Bom já tinha visto esse tutorial, mas não consegui se puder me ajudar a implementar agradeço muito !!!
beleza eu já estou no escritório,final da tarde eu monto e posto aqui!
>
Bom já tinha visto esse tutorial, mas não consegui se puder me ajudar a implementar agradeço muito !!!
@JowXavier, cara eu acabei ficando ocupado esse final de semana e não consegui montar o exemplo, mas faz assim me adiciona no skype ou msn que fazemos junto depois postamos o resultado aqui.
MSN: tiare_balbi@msn.com
Skype: tiarebalbi
Opá tbm estive muito ocupado esses dias, nem consegui me focar nesse problema ... Bom adicionei você no skype e msn, valew pela força.
Consegui resolver, o acesso aos módulos da forma "incorreta", mas que no momento foi a solução encontrada, já q nesse projeto não necessito de criar pemissões, mas vou implementar Zend_ACL ... Crie um campo na tabela de usuários com o nome do módulo q ele pode acessar em um arquivo que é usado em todas as páginas fiz uma verificação se ele pertence ao módulo ...
Você tem duas opções para resolver isso!!
1º Zend_Acl:
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