Impulsojunte-se à Impulso

08/08/19

4 min de leitura

Autenticação em Laravel e como modificar a validação das credenciais

Guilherme MarquesGuilherme Marques

Devs estão sempre em busca de dicas extras para facilitar a rotina de trabalho. E, dentro deste universo, uma das coisas que mais acaba dando dor de cabeça é a modificação da validação de credenciais dentro de um sistema. A autenticação em Laravel é uma ótima alternativa e não é algo tão difícil de ser feito. Com o Laravel é possível criar um login padrão (com email ou username e senha) para autenticar os usuários no sistema a ser desenvolvido. A autenticação está descrita na documentação na área de Segurança > Autenticação.

Seguindo a documentação, você cria o login com as views, controllers, models e migrations para criação da tabela no banco de dados. Até aqui, tudo bem, certo? Pois bem, as dúvidas costumam surgir quando se tem uma base de dados já em produção e o novo sistema que está desenvolvendo precisa utilizá-la para fazer a autenticação dos usuários. Normalmente, a senha está encriptada dentro desta base de dados, apresentando  um padrão diferente do que o Laravel utiliza. Por isso, vou mostrar como alterar a forma que o Laravel valida as credenciais do usuário. Assim, você poderá construir sua lógica de validação e autenticar os seus usuários.

Autenticação padrão do Laravel

O primeiro passo é fazer a autenticação padrão do Laravel, conforme disponibilizado nesta documentação. Em seguida, é necessário que você faça a alteração do config/auth.php. O processo é facilitado pelo uso de guards e providers.

  • Guards definem como os usuários são autenticados para cada requisição de login. Por exemplo, o Laravel vem com session guard que mantém o estado usando armazenamento de sessão e cookies. Então é necessário alterar o config/auth.php e criar um guard customizado e identificá-lo no provider.
  • Provider é a parte a ser estendida e a responsável por prover o override do método de validação das credenciais.
'guards' => [
       'web' => [
           'driver' => 'session',
           'provider' => 'csauth',
       ],

       'api' => [
           'driver' => 'token',
           'provider' => 'users',
           'hash' => false,
       ],

       'customcs' => [
           'driver' => 'session',
           'provider' => 'csauth',
       ]
   ], 

No provider, você deve fazer a seguinte alteração:

 'providers' => [
       'users' => [
           'driver' => 'eloquent',
           'model' => App\User::class,
       ],

       'csauth' => [
           'driver' => 'customcs',
           'model' => App\User::class,
       ]

       // 'users' => [
       //     'driver' => 'database',
       //     'table' => 'users',
       // ],
   ],

Alterando do app/Providers/AuthServiceProvider.php

Este Provider é responsável por determinar qual é o método de autenticação que será utilizado pelo Laravel. Quando não há alterações no método boot(), significa que o Laravel continuará utilizando seu método padrão. Aqui, vamos usar o CustomEloquentUserProvider . Para isso, add ao método boot() :

public function boot()
   {
      $this->registerPolicies();
       Auth::provider('customcs', function ($app, array $config) {
           return $app->make(CustomEloquentUserProvider::class, ['model' => $config['model']]);
       });
  }

Criando o Provider app/Providers/CustomEloquentUserProvider.php

Neste Provider, vamos adicionar a nossa validação personalizada das credenciais. Com isso, você pode implementar qualquer tipo de lógica e seguir a requisição do seu projeto. No método validateCredentials, se o feedback retornar true, significa que o seu usuário está logado.

 
<?php

namespace App\Providers;

use Illuminate\Auth\EloquentUserProvider;
use Illuminate\Contracts\Auth\UserProvider;
use Illuminate\Contracts\Auth\Authenticatable as UserContract;

class CustomEloquentUserProvider extends EloquentUserProvider
{
   public function validateCredentials(UserContract $user, array $credentials)
   {
       $plain = $credentials['password'];

       if ($plain == $seuModoDeValidacao) {
           return true;
       } else {
           return false;
       }


       // caso queira continuar autenticando pelo modo padrao do Laravel
       // ou seja, validar dos dois modos, utilize a linha de codigo abaixo
       // return parent::validateCredentials($user, $credentials);
   }

} 

Agora você pode validar qualquer credencial

Para concluir, também introduzi uma forma de você criar o seu próprio UserProvider. A vantagem de implementar a lógica no provider é que, além de permitir autenticar pelas credenciais utilizando sempre o mesmo algoritmo, fica fácil de compartilhar entre projetos ou múltiplos guards.

Todo UserProvider tem que possuir um método validateCredentials, que valida o hash da senha com o que foi encontrado no banco de dados. Vale lembrar que você não precisa criar um provider do zero. Você pode criar um que estende o user provider do Laravel e substituir apenas este método.

Agora é hora de você validar qualquer credencial que precisar ou até mesmo criar algum User. Se precisar de mais dicas como essas, é só acompanhar o nosso Blog. E se tiver dúvidas, você pode tirá-las dentro da nossa comunidade do Discord, onde temos vários devs especialistas à disposição!

Nós usamos cookies para melhorar sua experiência no site. Ao aceitar, você concorda com nossa Política de Privacidade

Assine nossa newsletter

Toda semana uma News com oportunidades de trabalho, conteúdos selecionados, eventos importantes e novidades sobre o Mundo da Tecnologia.

Pronto, em breve você vai receber novidades 👍