Fabyo 66 Denunciar post Postado Setembro 16, 2008 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
Leandro Barral 1 Denunciar post Postado Setembro 16, 2008 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
Fabyo 66 Denunciar post Postado Setembro 17, 2008 Obrigado mas entao nesse exemplo eu estou usando 2 plugins, se tiver alguma duvida so postar valeu Compartilhar este post Link para o post Compartilhar em outros sites
Leandro Barral 1 Denunciar post Postado Setembro 17, 2008 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
Fabyo 66 Denunciar post Postado Setembro 17, 2008 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
Leandro Barral 1 Denunciar post Postado Setembro 18, 2008 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
Leandro Barral 1 Denunciar post Postado Setembro 18, 2008 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
Fabyo 66 Denunciar post Postado Setembro 18, 2008 você usou MD5 na senha? Compartilhar este post Link para o post Compartilhar em outros sites
Smr 0 Denunciar post Postado Setembro 18, 2008 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
Smr 0 Denunciar post Postado Setembro 18, 2008 Oia, o Fabyo respondeu e eu nem vi...(meu navegador ja tava na página) Compartilhar este post Link para o post Compartilhar em outros sites
Fabyo 66 Denunciar post Postado Setembro 18, 2008 Isso mesmo, e o erro no nome do campo "nome" ja arrumei no sql e coloquei de novo pra download . qualquer duvida so postarem Compartilhar este post Link para o post Compartilhar em outros sites
Smr 0 Denunciar post Postado Setembro 18, 2008 Hmm, beleza Fabyo... Compartilhar este post Link para o post Compartilhar em outros sites
Leandro Barral 1 Denunciar post Postado Setembro 18, 2008 Como faço para cadastrar em md5 a senha no banco?? Desculpem a burrice! heauehaue Compartilhar este post Link para o post Compartilhar em outros sites
Smr 0 Denunciar post Postado Setembro 18, 2008 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
Leandro Barral 1 Denunciar post Postado Setembro 18, 2008 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
Fabyo 66 Denunciar post Postado Setembro 19, 2008 você precisa usar o firefox com plugin firebug, assim você consegue ver o retorno da pagina de login e saber onde você esta errando Compartilhar este post Link para o post Compartilhar em outros sites
Smr 0 Denunciar post Postado Setembro 19, 2008 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
Fabyo 66 Denunciar post Postado Setembro 19, 2008 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 = ) Compartilhar este post Link para o post Compartilhar em outros sites
Smr 0 Denunciar post Postado Setembro 19, 2008 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
Leandro Barral 1 Denunciar post Postado Setembro 19, 2008 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