Com o Laravel é possível criar um login padrão (com email ou username e senha) para autenticar os usuários no sistema que está a desenvolver. A autenticação está descrita na documentação na área de Segurança > Autenticação.

Seguindo a documentação, é criado 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, 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 e nessa base de dados a senha está encriptada em um padrão diferente do que o Laravel utiliza por padrão para autenticar, é que surgem as dúvidas e questionamentos. Então, nesse artigo vamos explicar como alterar a forma que o Laravel Valida as Credenciais do usuário. Com isso, você pode construir sua lógica de validação de usuários e autenticar esses usuários.

Autenticação padrão do Laravel

Primeiramente, faça a autenticação padrão do Laravel, conforme disponibilizado na documentação. Você pode visualizar a documentação clicando aqui.

Alterando o config/auth.php

A autenticação do Laravel é facilitada 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. Neste passo, é necessário alterar o config/auth.php e criar um guard customizado e identificá-lo no provider. Pois é este provider que será estendido e 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, alterar para:

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

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

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

Observe, que no providers criamos o provider csauth, que é o mesmo índice referenciado no guard que foi criado ‘provider’ => ‘csauth’, .

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 chamar 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, ao qual seu projeto requer, no método validateCredentials que, se o mesmo 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);
   }

} 

Para concluir, descrevemos aqui como você pode criar 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 aquele 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.

Qualquer coisa, estou na comunidade da Impulso Network e no LinkedIn para tirar dúvidas!