
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!