Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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())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>
Entao pessoal qualquer duvida so postar.
espero que gostem. :thumbsup:
Obrigado
mas entao nesse exemplo eu estou usando 2 plugins, se tiver alguma duvida so postar
valeu
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 []'..
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
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.
Achei uma coisa no Model Usuarios.php
Só mudar o "->setIdentityColumn('Nome')" para "->setIdentityColumn('login')"
Agora dá o erro de senha incorreta..
Oque proceder?
você usou MD5 na senha?
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....
Oia, o Fabyo respondeu e eu nem vi...(meu navegador ja tava na página)
Isso mesmo, e o erro no nome do campo "nome" ja arrumei no sql e coloquei de novo pra download .
qualquer duvida so postarem
Hmm, beleza Fabyo...
Como faço para cadastrar em md5 a senha no banco??
Desculpem a burrice! heauehaue
Quando você vai cadastrar direto pelo phpmyadmin, ao lado do campo da senha tem um combobox, ai é só escolher md5 nesse combo...
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 []'..
você precisa usar o firefox com plugin firebug, assim você consegue ver o retorno da pagina de login e saber onde você esta errando
O meu tb ta assim, eu pensei que ficava assim, só pra mostrar que funcionou...
uahhaushuahsahsausa...
Santa burrice.....
uma pergunta vcs criaram o banco e nao cadastram nenhum registro?
se for isso é claro que nao vai exibir nada, porque nao tem nada no banco = )
eu cadastrei, usuario -> admin e senha -> MD5(admin)
Mesmo assim não funcionou, a barra de progresso fica passando infinitamente...
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...
mas olhem no firebug e veja que erro ta dando
Grande Fabyo,
Cara baixei o sistema e fui usar e está dando o seguinte erro:
Warning: require_once(Zend/Loader.php) [function.require-once]: failed to open stream: No such file or directory in C:\Arquivos de programas\Apache Software Foundation\Apache2.2\htdocs\sites\Zend_Login_Plugin\index.php on line 23
Fatal error: require_once() [function.require]: Failed opening required 'Zend/Loader.php' (include_path='.;library\;application\controllers\plugins\;application\models\;.;C:\php5\pear') in C:\Arquivos de programas\Apache Software Foundation\Apache2.2\htdocs\sites\Zend_Login_Plugin\index.php on line 23
Realmente não existe este diretorio
nao mesmo so baixar
eu nunca coloco o Zend pra nao ficar grande os exemplos
A valeu cara!
nem me toquei em pensar nisso rsrs
Forte aBraço!
Fabyo, não sei como te passar o resultado do firebug... =/
nunca o utilizei..
se me der uma dica estou disposto a te ajudar! =D
Abraço.
Att,
Leandro Barral []'..
Opa Fabyo,
Cara agora baixei o zend coloquei no lugar certo, porém redireciona para /login e diz que este diretorio realmente não existe, lá nos arquivos realmente não tem.
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 []'..