Zend Framework
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>
Entao pessoal qualquer duvida so postar.
espero que gostem. :thumbsup:
Discussão (117)
Carregando comentários...