Integrando a autenticação com o banco

Cálcio Heavy Metal
PHPRio
Published in
5 min readJan 27, 2018

No artigo anterior implementamos o template e layout diferente para o admin. Nesse artigo vamos implementar a autenticação integrando com o banco.

Infelizmente o basic template do Yii não faz a implementação do login com o banco. Mas mostrarei como implementar o login da mesma forma que o advanced template faz.

Entendendo como funciona a autenticação no template basic

  1. A requisição (request) é feita pelo controllers/SiteController.php pelo método actionLogin();
  2. É iniciada uma comunicação com models/LoginForm.php passando os parâmetros username e password, para models/LoginForm.php;
  3. É chamado o método login(), chamando o método getUser() (models/LoginForm.php) que se comunica com o models/User.php;
  4. É chamando o método findByUsername() retornando o resultado da pesquisa para Yii::$app->user->login() no método login() (models/LoginForm.php).

Para simplificar um pouco esses passos, basicamente temos a autenticação sendo feita no LoginForm.php e a verificação de login e senha do usuário é feita pelo User.php usando os métodos da Interface IdentityInterface.

No template basic os dados dos usuários ficam em um array no arquivo models/User.php.

models/User.php

O Yii 2 já fornece uma interface (\yii\web\IdentityInterface) que já prepara seu ambiente para utilizar qual quer tipo de autenticação, essa mesma interface também é usada no template advanced, só que nesse template (advanced), essa interface é implementada de forma diferente, usando banco de dados.

Implementando a lógica de autenticação com o banco.

Esse processo é um pouco trabalhoso, mas vou tentar ser o mais objetivo possível, e a cada passo referenciar ao projeto no GitHub, para que possam pegar o código e implementar. É muito importante que sigam os passos e realmente pegue somente o código fornecido até o momento da leitura.

User.php

  • Crie o diretório models em /modules/admin;
  • Mova o arquivo /models/User.php para /modules/admin/models/User.php;
  • Mude o namespace de app\models para app\modules\admin\models;
  • Abaixo do namespace adicione os seguintes itens:
    use Yii;
    use \yii\db\ActiveRecord;
    use \yii\web\IdentityInterface;
    use \yii\base\NotSupportedException;
    use \yii\behaviors\TimestampBehavior;
  • Altere a declaração da classe de class User extends \yii\base\Object implements \yii\web\IdentityInterface para class User extends ActiveRecord implements IdentityInterface.
    Observe que aqui mudamos duas coisas. Trocamos a clase Objetc para a classe ActiveRecord, isso foi preciso para que essa classe possa utilizar banco de dados.
    Outra coisa que alteramos foi a chamada da implementação da interface IdentityInterface.
  • Remova do arquivo os atributos:
    public $id;
    public $username;
    public $password;
    public $authKey;
    public $accessToken;
  • Remova o array $users.

Existe mais alguns passos aqui. Recomendo que olhe o código abaixo.

LoginForm.php

  • Mova o arquivo /models/LoginForm.php para /modules/admin/models/LoginForm.php.
  • Mude o namespace de app\models para app\modules\admin\models;

O que fizemos até agora foi somente mover os arquivos responsáveis pelo login para o admin e modificar as classes para que o módulo admin possa usá-las.

Modificando o a tela principal do módulo Admin

Agora vamos fazer com que a tela principal do módulo admin seja o formulário de login e senha. Felizmente esse formulário já está pronto.

Mova o conteúdo arquivo /views/site/login.php para /modules/admin/views/default/index.php.

OBS: Se tentar rodar o admin vai receber um erro, pois as variáveis que o index precisa ainda não existem.

Configurando o componente User

Precisamos também alterar o arquivo /config/web.php na sessão (índice) user.


'user' => [
/**
* Call the model will implement IdentityInterface interface
* and authenticate methods.
* ==============================================================
* Chama o model que ira implementar a interface IdentityInterface
* e os métodos de autenticação.
*/
'identityClass' => 'app\modules\admin\models\User',
/**
* It's responsibly to define the default route (URL) login
* ==============================================================
* É responsável por definir a rota (URL) padrão de login
*/
'loginUrl' => ['admin/default/index'],
'enableAutoLogin' => true,
],

O que fizemos aqui foi informar ao sistema que a classe responsável pelo login do usuário está em app\modules\admin\models\User e que a url padrão do login/autenticação está em admin/default/index. Isso é feito para que no momento do logout ele seja redirecionado para o controller DefaultController.php e caia no método actionIndex().

Documentação sobre autenticação: http://www.yiiframework.com/doc-2.0/guide-security-authentication.html

Editando alguns arquivos para o login e logout funcionar

Iremos modificar o arquivo /modules/admin/controllers/DefaultController.php para que o assim que acessarmos o admin ele carregue o formulário de login e também já faça o login e o logout do sistema. Precisamos também alterar o método behaviors para dar as devidas permissões de acesso aos outros métodos da classe /modules/admin/controllers/DefaultController.php.php e instanciar o objeto responsável pelo login (no nosso caso o LoginModel.php). Veja o arquivo abaixo

Filtro de Controle de Acesso (Access Control Filter — ACF)

O ACF é um método de autorização simples que implementa o yii\filters\AccessControl onde é melhor usado em sistemas cujo o método de autenticação seja de controles simples (como é no nosso caso). Para controles mais complexo usaríamos o RBAC, mas isso fica para outro projeto.

Esse controle geralmente fica nos Controller da aplicação no método behaviors que utiliza a classe AccessControl. Nele definimos todas as regras de permissão.

No parâmetro only do método behaviors definimos quais métodos do Controller serão verificados, caso algum método não esteja nesse parâmetro ele não irá ser verificado.

No parâmetro rules do método behaviors informamos ao Yii que que as actions index e error podem ser acessadas sem autenticação isso foi feito com ‘roles’ => [‘?’] (default), e as actions logout e dashboard só podem ser acessadas se o usuário estiver logado na aplicação, isso foi feito adicionado o ‘roles’ => [‘@’], na configuração da rules.

Documentação sobre autorização: http://www.yiiframework.com/doc-2.0/guide-security-authorization.html

Limpando códigos inúteis

Agora precisamos limpar alguns scripts remover algumas coisas desnecessárias.

Abra o arquivo /controllers/SiteController.php e remova as chamadas use yii\filters\AccessControl;, use yii\filters\VerbFilter; e use app\models\LoginForm;. Remova seguintes métodos: behaviors(), actionLogin() e actionLogout(). Salve o arquivo.

Remova os models /models/User.php e /models/LoginForm.php (caso ainda não tenha feito isso).

Remova a view /views/site/login.php (caso ainda não tenha feito isso).

E por último, abra o arquivo ./views/layouts/admin.php e altere a label Dashboard do menu de ‘url’ => [‘default/index’] para ‘url’ => [‘default/dashboard’].

Com isso finalizamos essa saga de implementar uma autenticação utilizando o Yii2 Basic.

Mais uma etapa concluída do projeto. Acompanhe o projeto e vejas os arquivos no GitHub: https://github.com/Calcio/vitrine

--

--