RSS
 

Como criar um sistema de login com Zend Framework

06 fev

Developers,

primeiramente entendam que Zend_Auth lida apenas com autenticação e não autorização (mais para frente iremos ver como através da Zend_Acl). A autenticação é feita com base em credenciais, verificando a identidade do usuário, portanto vamos criar uma tabela de usuários chamada users em nosso banco de dados Sample Project.

Criando a tabela no banco de dados

CREATE TABLE `sampleproject`.`users` (
`user_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`user_name` VARCHAR( 150 ) NOT NULL ,
`user_email` VARCHAR( 64 ) NOT NULL ,
`user_password` CHAR( 40 ) NOT NULL
) ENGINE = MYISAM COMMENT = 'Tabela de usuários';

Criando conexão com o banco de dados

Recentemente publiquei um artigo sobre como criar conexão com banco de dados MySQL usando Zend Framework. Nele a aplicação está bem completa.

Criando o formulário de login

class Sample_Form_Login extends Zend_Form
{
    public function init()
    {
        $this->setAction('');
        $this->setMethod('POST');

        $user_email = new Zend_Form_Element_Text('user_email');
        $user_email ->setLabel('Email');

        $user_password = new Zend_Form_Element_Password('user_password');
        $user_password->setLabel('Senha');

        $act = new Zend_Form_Element_Submit('act');
        $act->setLabel('Entrar');

        $this->addElements(
            array(
                $user_email,
                $user_password,
                $act
            )
        );
    }
}

Criando o AuthController

Nesse controlller é onde criaremos nossas regras de negócios de login e logout.

class AuthController extends Zend_Controller_Action
{

    public function init()
    {

    }

    public function indexAction()
    {
        // Redireciona para o login
        $this->_redirect('auth/login');
    }

    public function loginAction()
    {
        // Instancia o formulário de login
        $objFormLogin = new Sample_Form_Login();
        $this->view->objFormLogin = $objFormLogin;

        // Verifica se foi submetido via POST
        if( !$this->_request->isPost() )
            return false;

        // Obtém os dados passados via POST
        $data = $this->_request->getPost();

        // Se os dados forem validos
        if( !$objFormLogin->isValid($data))
            return false;

        // Cria uma instancia de Zend_Auth
        $objAuth = Zend_Auth::getInstance();

        /**
         * Instancia o Auth Db Table Adapter
         *
         * Quando se instancia este objeto, precisamos informar as configurações
         * do BD, nome da tabela onde os dados de login estão, o campo do nome
         * do usuário, e o campo da senha na tabela.
         */
        $authAdapter = new Zend_Auth_Adapter_DbTable(
                Zend_Registry::get( 'db' ),
                'users',
                'user_email',
                'user_password',
                'sha1(?)'
        );

        // Configura as credencias user_email e user_password informadas pelo usuário
        $authAdapter->setIdentity( $data['user_email'] )->setCredential( $data['user_password']);

        // Tenta autenticar o usuário
        $result = $objAuth->authenticate($authAdapter);

        /**
         * Se o usuário for autenticado redireciona para a index e grava seu email,
         * caso contrário exibe uma mensagem de alerta na página
         */
        if ( $result->isValid() ) :

            /**
             * Pega os dados do usuário, omitindo a senha
             * http://framework.zend.com/manual/en/zend.auth.adapter.dbtable.html
             */
            $authData = $authAdapter->getResultRowObject( null, 'user_password' );

            // Armazena os dados do usuário
            $objAuth->getStorage()->write( $authData );

            echo 'Login efetuado com sucesso!';
        else :
            echo 'Os dados informados (e-mail e/ou senha) não são válidos.';
        endif;
    }

    public function logoutAction()
    {
        $objAuth = Zend_Auth::getInstance();

        // Limpa a autenticação
        $objAuth->clearIdentity();
    }
}

Registrando o namespace “Sample”

Para que o zend entenda ao chamar a classe Sample_Form_Login(), é necessário que dentro do seu bootstrap você registre o namespace “Sample”, que é onde você vai guardar seus formulários, dentre eles o formulário de login.
Nesta função é criada um auto-carregamento dos conteúdos que ali estão, veja como ficará seu bootstrap.

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initAutoLoader()
    {
        // Cria uma instancia de autoloader
        $autoloader = Zend_Loader_Autoloader::getInstance();

        // Registra o namespace Sample
        $autoloader->registerNamespace('Sample');
    }
}

Concluindo

Bom pessoal, aprendemos como criar uma conexão com banco da dados MySQL, criamos um formulário de login usando Zend_Form e criamos nossa classe de autenticação AuthController com as actions de login e logout. Nossa muito conteúdo para apenas um post! :D Então pessoal, agora é vocês adaptarem esse sistema na aplicação de vocês!

Abraços e comentem suas dúvidas, críticas e/ou elogios!

Artigos relacionados:

  1. Como fazer upload de imagens usando Zend Framework
  2. Como criar conexão com banco de dados MySQL usando Zend Framework
  3. Como criar um plugin para wordpress – Parte 2
  4. Como criar um projeto usando a Zend_Tool do Zend Framework
  5. Como usar a Zend_Tool para criar um projeto em Zend Framework
 

Leave a Reply

 
 
  1. Daniel Developer

    12/03/2010 at 04:05

    Marco,

    1 – Não, deve estar dentro de modules/default/controllers;
    2 – Ok;
    3 – Perfeito;
    4 – Certo;
    5 – Você deve enviar para a view o formulário assim:

    $this->view->objFormLogin = $objFormLogin;

    e na view admin.phtml você deve chama-lo assim:

    echo $this->objFormLogin;

    Tente isso! Vai dar certo. Abraços

     
  2. Vitor

    12/03/2010 at 04:11

    como eu seto as views como UTF-8?

     
  3. Daniel Developer

    15/03/2010 at 03:43

    Vitor,

    no seu application.ini coloque:

    resources.view.encoding = "UTF-8"

    Abraços

     
  4. Vitor

    15/03/2010 at 05:17

    já está assim!

     
  5. Vitor

    15/03/2010 at 06:02

    estou tentado criar um helper mais está dando o seguinte erro

    Message: Action Helper by name Toolbar not found

    Meu helper

    class Controller_Action_Helper_Toolbar extends Zend_Controller_Action_Helper_Abstract
    {…} e chamada no controller

    fico assim

    $this->_helper->Toolbar->getToolbar();

    sabe me dizer oq pode ser?

     
  6. Vitor

    18/03/2010 at 05:24

    tem como configurar a pasta de upload no application.ini e capturar?

     
  7. Nuno

    26/03/2010 at 08:08

    Oi Daniel gostei do seu blog! Bons tutoriais! ;)
    Eu ja tinha o meu sistema de login começado, de maneira que nem tudo está igual ao seu.
    No meu sistema está a dar o seguinte erro

    No entry is registered for key ‘db’

    Gostaria que você me explicasse melhor o seguinte
    código:

    $authAdapter = new Zend_Auth_Adapter_DbTable(
    Zend_Registry::get( ‘db’ ),
    ‘users’,
    ‘user_email’,
    ‘user_password’,
    ‘sha1(?)’
    );

    Obrigado

     
  8. Daniel Developer

    26/03/2010 at 14:10

    Nuno,

    me parece que não criou ainda conexão com o banco de dados. Veja meu artigo sobre http://www.danieldeveloper.com/2010/02/02/criando-conexao-com-banco-de-dados-usando-zend-framework/

    Ao criar o banco de dados, você registra a conexão, nesse caso, dá-se o nome de ‘db’. No código: Zend_Registry::get( ‘db’ ) você busca a conexão feita.

     
  9. Nuno

    27/03/2010 at 18:41

    Valeu Daniel.. ta funcionando bem agora! :)

    Eu tou começando com esta framework ha pouco tempo. Ja fiz uns exemplos de leitura e escrita no banco de dados, mas nao tive a necessidade de criar esta conexão.

    Por exemplo:

    class Application_Model_DbTable_Posts extends Zend_Db_Table_Abstract
    {
    protected $_name = ‘posts’;

    public function getPost($id)
    {
    $id = (int)$id;
    $row = $this->fetchRow(‘id = ‘ . $id);
    if (!$row) {
    throw new Exception(“Count not find row $id”);
    }
    return $row->toArray();
    }
    }

    neste exemplo eu nao preciso dessa conexão. Isso é por causa da classe Zend_Db_Table_Abstract que faz tudo automáticamente indo ao ficheiro application.ini?
    Para o exemplo do login não é possível fazer algo igual, sem necessidade de registar a conexão?

    Obrigado

     
  10. maxwell

    30/03/2010 at 07:44

    opa ^^
    cara, eu to meio enrolado, eu sou novo no zend, estudei o básico, mas tem coisas q eu n entendo, q é ond q ficam os arquivos por exemplo, nesse teu tuto, eu n sei o q vai no index.phtml, sim, os q vao na pasta controllers eu sei, mas os outros n =/

     
  11. Daniel Developer

    31/03/2010 at 03:45

    Maxwell,

    veja os artigos da categoria Sample Project, será muito útil. Abraços

     
  12. Francisco Leal

    29/04/2010 at 14:41

    Daniel, teria um artigo seu aqui no blog pegando carona nesse de login, com tempo logado, tipo expirar por inatividade no site.

     
  13. Daniel Developer

    30/04/2010 at 11:52

    Francisco,

    no momento ainda não tenho nada postado sobre o assunto. Em breve um novo artigo sobre um login com mais funcionalidades será postado. Acompanhe o blog.

    Abraços

     
  14. Santiago

    06/05/2010 at 03:53

    Muito bom o seu blog! Tem me servido muito e espero por novos posts.
    Você é o cara!

     
  15. Ricardo

    11/05/2010 at 10:59

    Fala Daniel, blz ?

    Estou iniciando com o zend e tenho uma dúvida, como eu posso pegar os dados do usuário para verificar se ele esta logado ou não em outras páginas.

    Exemplo: ele fez o acesso na página index através do login e senha, e possui a página produtos que irá listar os produtos daquele usuário, como faço para pegar os dados na classe ProdutosController.

    Abs.

     
  16. Daniel

    13/05/2010 at 06:42

    Oi Daniel, parabéns pelo blog pois vejo que todos estão se entendendo bem com seus artigos.
    Sou iniciante em PHP e acho que vou ficar deprimido! hehehe…
    É que já li tudo quanto é artigo e não consigo sair do zero. Estou mais perdido do que cego em tiroteio.
    Tem alguma solução pra mim?! Estou precisando muito começar!
    Abraço!

     
  17. Daniel Developer

    13/05/2010 at 15:25

    Daniel,

    O ideal seria de início um bom curso em PHP, verifique na sua cidade ou alguns cursos online. Após se familiarizar com o PHP, você já pode começar a estudar um CMS como o WordPress que é excelente e também o nosso framework Zend Framework, onde você encontrará bons artigos por aqui.

    Abraços.

     
  18. Daniel Developer

    17/05/2010 at 13:30

     
  19. Felipe Duardo

    04/06/2010 at 04:25

    Bom artigo daniel parabéns!

    acho que você poderia cumprir com sua palavra!!! hehe
    e fazer um artigo com o zend_acl, mas não daqueles tipos
    tradução do manual que se ve muito por ai… e sim um
    com resources e roles armazenados em um db…

    estou nesse desafio . heehhe

    abraço

     
  20. Alessandro

    23/06/2010 at 06:22

    Muito bom!
    Parabéns Daniel, excelente didática.
    Exemplos muito bem construídos.
    Apoio sua iniciativa de contribuir com os que buscam conhecer mais sobre Zend Framework.

    Continue assim…

     
  21. Emilio C. Rodrigues

    30/06/2010 at 06:01

    Olá. Parabéns pelo Blog. Esta matéria me ajudou muito! Eu estava quase desistindo de utilizar o ZF. Mas agora vou pegar mais firme nos estudos. Agradeço o exemplo e parabéns mais uma vez. Vlw o/

     
  22. Daniel

    07/07/2010 at 09:34

    Daniel,
    me tira uma duvida, sou novo em zend e nao estou conseguindo chamar o login.php. coloquei no meu index.phtml a chamada para a função login.php porem me avisa que o login.php nao foi encontrado dentro do servidor. Existe algo que deva configurar para ter acesso? como ficaria um html simples dessa chamada? tem algo peculiar? valeu fera

     
  23. Daniel Developer

    13/07/2010 at 05:24

    Xará,

    como está chamando o login.php e onde?

     
  24. Eric

    11/08/2010 at 04:15

    Olá Daniel, bom dia.

    Primeiramente gostaria de agradecer essa grande colaboração aos Developer.

    Estou iniciando com Zend, segui todos os módulos que vc disponibilizou no seu blog, porém estou com algumas dúvidas ainda.

    Neste post eu não consegui captar o diretório e nome que podem ser salvos os scripts :

    Criando o formulário de login
    Criando o AuthController

    Se você tiver o projetinho e puder disponibilizar no post…

    Forte abraço

     
  25. Daniel Developer

    13/08/2010 at 04:30

    Eric,

    geralmente os locais e nomes dos scipts ficam a critério de cada desenvolvedor. No meu Sample Project, ficam bem claras as formas como eu desenvolvo, tente se espelhar por lá, é uma boa prática de programação.

    Abraços