Tutorial ZF2 + Doctrine + ZfcUser + Los – Parte 4

Hoje vamos falar um pouco sobre Autenticação (ZfcUser) e Autorização (ZfcRbac).

Autenticação x Autorização

Autenticação é o processo de identificação de um usuário no sistema, em outras palavras, é o Login.

Autorização é uma medida de segurança que controla o que o usuário pode fazer dentro do sistema.

Um dos módulos mais usados para autenticação é o ZfcUser. Ele fornece vários recursos, mas o básico é o login, registro de novos usuários e diversos helpers.

Outro módulo muito usado para integração com redes sociais é o ScnSocialAuth que torna fácil inserir um login social (Facebook, Twitter, Google+, LinkedIn e vários outros) no seu projeto. Mas neste tutorial vamos usar apenas login simples, depois vou fazer um post exclusivamente sobre logins sociais, recurso que vem sendo muito utilizado hoje em dia.

Para autorização também temos algumas opções, como o Zend\Acl e Zend\Rbac, mas vamos utilizar o ZfcRbac que já nos oferece integração com o ZfcUser e deve ser a base para o componente de Rbac no ZF3.

Neste tutorial vamos usar o ZfcUser para autenticação e o ZfcRbac para autorização.

Configuração

No nosso primeiro post já instalamos o módulos e agora vamos configurá-los.

Primeiro vamos habitar os módulos na nossa aplicação no config/application.config.php:

E vamos criar o config/autoload/zfcuser.global.php:

Na linha 4, definimos qual entidade vamos usar para o usuário do sistema e na 5 dizemos que vamos usar nossa entidade e não a padrão do ZfcUser. Para podermos usar outras entidades, basta ela ter como interface a ZfcUserInterface.

Como nosso projeto tutorial não possui um “Registre-se”, vamos usar o ZfcUser apenas para controlar o login, desativamos o registro na linha 6.

Desativamos também o uso de username (linha 7), pois vamos usar o email (linha 10) como login da pessoa.

Na linha 19 definimos o nome da tabela de usuários.

Vamos criar agora o arquivo config/autoload/zfcrbac.global.php:

Primeiro, definimos que o papel de quem não está logado é ‘visitante’. Depois dizemos que para acessar a rota ‘dashboard’, o usuário precisa ter o papel ‘usuário’, enquanto que para todas as rotas que comecem com ‘cliente/’ e ‘usuário/’ ou o Controller ‘UsuarioController’, precisa ter o papel ‘admin’.

Em seguida, criamos os papéis do sistema (admin, usuário e visitante) e informamos que quando alguém estiver conectado e não tiver permissão suficiente, será redirecionado para a rota ‘error/403’, e se não estiver logado no sistema, irá para a rota ‘zfcuser/login’.

Existem outros parâmetros sobre os quais não entrarei em detalhes, mas basta consultar as páginas do ZfcUser e ZfcRbac par aa relação completa e os detalhes de cada um.

Para o ZfcRbac funcionar automaticamente com o ZfcUser, basta acrescentar as seguintes linhas no config/autoload/global.php:

E no module/Application/src/Application/Module.php, acrescente as linhas abaixo dentro do método onBootstrap:

Com isso acrescentamos a estratégia de Redirect do ZfcRbac à lista dos eventos da aplicação.

Se abrirmos o navegador e tentarmos acessar o dashboard, seremos redirecionados para a página de login padrão do ZfcUser. Se quiser personalizar a página, consulte o guia do ZfcUser no wiki.

Pronto. Nossa aplicação está segura. Apenas usuários que realizaram o login podem acessar as páginas que definimos, e restringimos o acesso a outras apenas a usuários administradores.

Neste tutorial usei os papéis (roles) e permissões, diretamente no arquivo de configuração. Para aplicações pequenas até pode ser o ideal, mas se tiver muitos papéis diferentes, uma árvore de permissões, etc é melhor usar os dados no banco de dados. A página do ZfcRbac mostra como fazer esta configuração, entre outras.

No próximo post da série, vou mostrar como está a utilização do sistema, desde o login, passando pelos CRUDs que criamos, testando as permissões, etc.

Referência:

Parte 1: Instalação e configuração

Parte 2: Banco de dados (Doctrine)

Parte 3: Visual e Layout (LosUi)

Parte 4: Autenticação e Autorização (ZfcUser e ZfcRbac)

Parte 5: Usando o sistema

 

Até a próxima!

Leandro Silva

PHP developer since 1997, loves movies, music and dogs.

17 Comentários para: “Tutorial ZF2 + Doctrine + ZfcUser + Los – Parte 4

  1. Muito Obrigado por Compartilho o seu conhecimento. Gostaria de saber teria como eu usar o ZfcUser, com mais de uma entidade, ex no modulo Admin usar a Entidade Admin, no Modulo Cliente Entidade Cliente, Modulo Fornecedor Entidade Fornecedor assim por diante…

    • Altere o arquivo config/autoload/zfcrbac.global.php:

      [
      // ‘identity_provider’ => ‘ZfcRbac\Identity\AuthenticationIdentityProvider’,
      ‘guest_role’ => ‘visitante’,
      ‘guards’ => [
      ‘ZfcRbac\Guard\RouteGuard’ => [
      ‘home’ => [‘visitante’],
      ‘usuario/*’ => [‘visitante’],
      ],
      ‘ZfcRbac\Guard\ControllerGuard’ => [
      [
      ‘controller’ => ‘Usuario\Controller\Usuario’,
      ‘roles’ => [‘visitante’]
      ],
      ]
      ],

    • Bom dia Igor! Não, mas infelizmente estou trabalhando de segunda a segunda e não tive tempo de terminar o tutorial ainda, mas como vou dar o mini-curso na TICNOVA 2015, vou aproveitar para atualizar e terminar o tutorial. Desculpe a demora.

  2. Parabéns pelo portal, sua forma de comunicar é muito boa.

    To começando com ZF2 agora (digo exatamente agora), consegui chegar até o final, porem alguns conceitos ainda preciso de cola para que eu possa desenvolver atendendo minha necessidade, portanto meu caro, faça os próximos passos do tutorial huauahaa

    mais uma vez parabéns…

  3. como rodar esses códigos com verão do zend 2.5 acima pois a minha dar um erro ou melhor alerta que as classes estão obsolentas.

    • Olá Francisco! Alguns dos módulos ainda não são compatíveis com as versões mais recentes da framework (em especial maiores que a 2.6 que já são com compatibilidade com a ZF3). O ideal é fixar no composer.json o zendframework 2.4 por enquanto mesmo.

      • Estou usando a versão 2.4 e mesmo assim continua dando o erro
        PHP Fatal error: Uncaught Zend\\Navigation\\Exception\\InvalidArgumentException: Invalid argument: Unable to determine class to instantiate in /var/www/los/vendor/zendframework/zendframework/library/Zend/Navigation/Page/AbstractPage.php:254\

        Poderia nos ajudar?

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

*