
08/08/19
4 min de leitura

Autenticação em Laravel e como modificar a validação das credenciais
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!