Ir para conteúdo

Arquivado

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

Fabyo

Zend Framework

Recommended Posts

Zend_Auth

 

Sistema de Login com Zend + Layout e Extjs

 

Pessoal estou sem tempo e por isso nao posso criar um tutorial bem detalhado, mas como eu ja estou devendo um exemplo do Zend_Auth entao estou postando ele aqui, pra quem ja tem as manjas é so olhar que nao tem segredo, mas quem tiver duvida so postar que eu explico.

 

OBS: Incluir a pasta library, configurar includes/config_db.php, base de dados esta na raiz: base.sql

 

Para quem quer entender como funciona o Zend_Auth esse script mostrara como fazer um script seguro.

basta examinar o arquivo LoginController.php

 

mas esse script tem umas funcionalidades a mais que vou explicar em seguida:

 

* Janela de login em Extjs (Janela Modal, com funcionalidades e validacoes, valida ate a tecla Caps Lock) pra quem nao conhece Extjs visite :

http://extjs.com/products/extjs/

 

* Sistema do Zend_Layout, mas eu criei um plugin para deixar o layout mais dinamico, por exemplo quando esta na pagina de login o layout inclui os arquivos necessarios para fazer o login, quando esta em outra pagina ele nao inclui.

 

* Sistema de plugin para autenticacao dinamica, nao importa a pagina que o usuario entre se ele nao tiver logado o sistema ira pedir o login para ele.

 

* Usei os dados de conexao guardados em um arquivo .php o config_db.php, e o config.xml para umas funcionalidades basicas.

 

* Pagina de erros, caso o usuario digite uma pagina que nao exista.

 

* Sistema de logs.

 

index.php

 

<?php
if(version_compare(phpversion(), 5) === '-1'){
die('É necessario ter PHP 5 ou superior');
}

if (!extension_loaded('pdo')) {
die('É necessario o modulo PDO');
}

if (!extension_loaded('pdo_mysql')) {
die('É necessario o modulo pdo_mysql');
}

define('DS', DIRECTORY_SEPARATOR);
define('PS', PATH_SEPARATOR);

set_include_path('.'
. PS . 'library' . DS
. PS . 'application' . DS . 'controllers' . DS . 'plugins' . DS
. PS . 'application' . DS . 'models' . DS
. PS . get_include_path());

require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();

$config = new Zend_Config_Xml('includes' . DS . 'config.xml', 'config');

error_reporting((int) $config->error_reporting);
ini_set('display_errors', (bool) $config->display_errors);

$log = new Zend_Log(new Zend_Log_Writer_Stream('logs'. DS .'log.txt'));
Zend_Registry::set('log', $log);

setlocale(LC_ALL, $config->setlocale);
date_default_timezone_set($config->timezone);

Zend_Registry::set('config', new Zend_Config(require_once 'includes'. DS .'config_db.php'));

Zend_Layout::startMvc();

Zend_Controller_Front::getInstance()
->registerPlugin(new LayoutPlugin())
->registerPlugin(new SecurityPlugin())
->throwExceptions((bool) $config->throwExceptions)
->run('application' . DS . 'controllers' . DS);

 

SecurityPlugin.php

 

<?php
class SecurityPlugin extends Zend_Controller_Plugin_Abstract
{
public function routeShutdown(Zend_Controller_Request_Abstract $oRequest) 
{
	$sControllerName = $oRequest->getControllerName();
	$oAuth		   = Zend_Auth::getInstance();
	if (strtolower($sControllerName) != 'login' && !$oAuth->hasIdentity()) {			 
		$oFrontController = Zend_Controller_Front::getInstance();
		$sBaseUrl		 = $oFrontController->getBaseUrl();
		$this->getResponse()->setRedirect($sBaseUrl . '/login/', 302);
	}
}
}

 

LayoutPlugin.php

 

<?php
class LayoutPlugin extends Zend_Controller_Plugin_Abstract
{	
public function dispatchLoopStartup(Zend_Controller_Request_Abstract $oRequest)
{
	$sControllerName = $oRequest->getControllerName();
	$path = $this->_request->getBaseUrl().'/public/';

	$view = new Zend_View();
	$view->headMeta()->appendHttpEquiv('Content-Type', 'text/html; charset=UTF-8')
		 ->appendHttpEquiv('Content-Language', 'pt-BR')
		 ->appendHttpEquiv('expires', 'Wed, 26 Feb 1997 08:21:57 GMT')
		 ->appendHttpEquiv('pragma', 'no-cache')
		 ->appendHttpEquiv('Cache-Control', 'no-cache')				 
		 ->appendHttpEquiv('imagetoolbar', 'no')
		 ->appendHttpEquiv('Content-Encoding', 'gzip');	

	$view->headLink()->appendStylesheet($path.'css/ext-all.css');

	if(strtolower($sControllerName) == 'login'){
		$view->headScript()->appendFile($path.'js/ext-base.js')
			 ->headScript()->appendFile($path.'js/ext-all.js')
			 ->headScript()->appendFile($path.'js/cookies.js')
			 ->headScript()->appendFile($path.'js/ext-ux-login.js')
			 ->headScript()->appendFile($path.'js/capslock.js')				   
			 ->headScript()->appendFile($path.'js/ext-lang-pt_BR.js');
	} elseif(strtolower($sControllerName) == 'index') {
		$view->headScript()->appendFile($path.'js/ext-base.js')
			 ->headScript()->appendFile($path.'js/ext-all.js')
			 ->headScript()->appendFile($path.'js/cookies.js')
  				 ->headScript()->appendFile($path.'js/index.js')
			 ->headScript()->appendFile($path.'js/ext-lang-pt_BR.js');
	}		
}
}

 

OBS: Sistema de login muito seguro e correto.

 

LoginController.php

 

<?php

class LoginController extends Zend_Controller_Action
{
public function indexAction()
{		
	$this->view->headTitle('Login');	
}

public function logarAction()
{
	$this->_helper->removeHelper('viewRenderer');
	$this->_helper->layout->disableLayout();

	if ($this->_request->isPost()) {
		$log = Zend_Registry::get('log');

		$filter = new Zend_Filter();
		$filter->addFilter( new Zend_Filter_StringTrim() );

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

		try {
			$result  = Usuarios::ValidaUsuario($nome, $senha);

			switch ($result->getCode()) {
				case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:
					$mensagem = "{success: false, msg: {text: 'Usuário não cadastrado!', code: '2'}}";
					break;
				case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
					$mensagem = "{success: false, msg: {text: 'Senha errada', code: '3'}}";
					break;
				case Zend_Auth_Result::SUCCESS:
					$data = $result->authAdapter->getResultRowObject(null,	'senha');
					if($data->Nivel_Acesso > 0){														
						$result->auth->getStorage()->write($data);
						$log->log('Usuario = '.$nome, Zend_Log::INFO);
						$mensagem = "{success:true, link: '".$this->_request->getBaseUrl()."', nivel:'{$data->Nivel_Acesso}'}";
					} else {
						$result->auth->clearIdentity();
						$log->log('Voce nao tem permissao de acesso, Usuario = '. $login, Zend_Log::INFO);
						$mensagem = "{success:false, msg: {text: 'Voce nao tem permissao de acesso', code:'2'}}";
					}
					break;
			}				

		} catch (Zend_Db_Adapter_Exception $e) {					
			$log->log('Erro Conexao, '. $e->getMessage(), Zend_Log::CRIT);
			$mensagem = "{success:false, msg: {text: 'Erro conexao, ". $e->getMessage() ."', code:'6'}}";
		} catch (Zend_Exception $e) {
			$log->log('Erro Sistema, '. $e->getMessage(), Zend_Log::CRIT);
			$mensagem = "{success:false, msg: {text: 'Erro Sistema, ".$e->getMessage()."', code:'6'}}";
		}
		$this->getResponse()->clearBody();
		$this->getResponse()->setHeader('Content-Type', 'text/x-json');
		$this->getResponse()->setBody($mensagem);			
	}
}

function logoutAction()
{
	$this->_helper->removeHelper('viewRenderer');
	$this->_helper->layout->disableLayout();

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

 

layout.phtml

 

<?= $this->DocType('XHTML1_STRICT')."\n";?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-BR" lang="pt-BR">
<head>
<?= $this->headTitle()."\n";?>
<?= $this->headMeta()."\n";?>
<?= $this->headLink()."\n";?>
<?= $this->headScript()."\n";?>
</head>
<body>
<?= $this->layout()->content;?>
</body>
</html>

 

Zend_Login_Plugin.zip

 

Entao pessoal qualquer duvida so postar.

 

espero que gostem. :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Wow! Parabéns Fabyo, você falou mesmo que iria postar, estava no aguardo há tempos! eahuehaueh

 

Muito obrigado, o sistema aqui na empresa já estou fazendo com aqueles tutoriais que você postou e com um livro sobre zend q eu comprei, agora posso implantar o login!

 

Obrigado! E.. se eu puder dar uma dica/solicitação de próximo tutorial.. Quando tiver um tempo postar sobre plugins e como eles funcionam e tals, até hoje não o entendi.

 

Att,

 

Leandro Barral []'..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi essa parte:

public function routeShutdown(Zend_Controller_Request_Abstract $oRequest)

O nome desse método é do FW ou você quem dá o nome?

 

Também não entendi essa passagem de parametros $oRequest...

 

Outra coisa, tenho que registrar no bootstrap todos os plugins? Ou posso registra-lo somente nas página que eu quiser que tenha um acesso privado?

->registerPlugin(new SecurityPlugin())

Poderia me esclarecer?

 

Desde já agradeço a atenção!

 

Att,

 

Leandro Barral []'..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos por partes, primeiro você precisa entender os eventos e em qual sequencia eles sao chamados

 

http://framework.zend.com/manual/en/zend.c...ler.basics.html

 

o nome é do proprio ZF

 

e o parametro eu to passando um tipo de classe por referencia

 

e os plugins você registra no index mesmo porque é onde passa todos os scripts e sabendo fazer um plugin ele ira funcionar de acordo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fabyo, dá erro na hora da autenticação, aparece uma janela personalizada [do extjs] falando que ocorreu um erro..

 

eu adicionei na tabela usuario do bd automotive usuario teste senha teste

 

mesmo assim não vai.. oque está ocorrendo de errado?

 

Abraço.

 

Att,

 

Leandro Barral []'..

 

P.S.:

Erro Sistema, The supplied parameters to Zend_Auth_Adapter_DbTable failed to produce a valid sql statement, please check table and column names for validity.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Achei uma coisa no Model Usuarios.php

 

Só mudar o "->setIdentityColumn('Nome')" para "->setIdentityColumn('login')"

 

Agora dá o erro de senha incorreta..

 

Oque proceder?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leandro, se eu não me engano o sistema está verificando a senha em MD5, no banco você tem que adicionar a senha como MD5 tb....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando você vai cadastrar direto pelo phpmyadmin, ao lado do campo da senha tem um combobox, ai é só escolher md5 nesse combo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, agora ele fica assim "Validando Usuário" e não sai disso...

 

Oque posso estar fazendo de errado?

 

Abraço, e agradeço a Atenção!

 

Att,

 

Leandro Barral []'..

Compartilhar este post


Link para o post
Compartilhar em outros sites

O meu tb ta assim, eu pensei que ficava assim, só pra mostrar que funcionou...

 

uahhaushuahsahsausa...

 

Santa burrice.....

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu cadastrei, usuario -> admin e senha -> MD5(admin)

 

Mesmo assim não funcionou, a barra de progresso fica passando infinitamente...

Compartilhar este post


Link para o post
Compartilhar em outros sites

fiz a mesma coisa, cadastrei usuario leandro e senha teste em md5

e o nivel de acesso escolhi o 3

 

detalhe que se não tiver nada no banco ele dirá que o usuario não existe...

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.