Múltipla Autenticação Laravel

Umas das funcionalidades mais bacanas que o laravel 5.2 trouxe de padrão é a possibilidade de criar de forma nativa multi-autenticação, por exemplo criar autenticação para o cliente e para o administrador do site.

O exemplo que vou apresentar, foi desenvolvido e testado no laravel 5.4:

Arquivo de configuração auth.php

Acessando o diretório /config, nos temos todos os arquivos de configurações do laravel, dentre este arquivos tem o auth.php, é ele que vamos alterar, porém para efetuar as alterações temos que entender cada parte.

Padrão de Autenticação

‘defaults’ => [
 ‘guard’ => ‘web’,
 ‘passwords’ => ‘users’,
 ]

Esta opção controla as opções de “proteção” de autenticação padrão e de redefinição de senha para sua aplicação. Você pode alterar esses padrões conforme necessário.

Guard

‘guards’ => [
 ‘web’ => [
 ‘driver’ => ‘session’,
 ‘provider’ => ‘users’,
 ],
‘admin’ => [
 ‘driver’ => ‘session’,
 ‘provider’ => ‘admins’,
 ],
 ]

Esta configuração serve para definir qual o tipo de driver que pode ser [token ou session] e qual tabela vai prover os dados, por padrão o laravel já traz configurado a tabela de users. Importante ressaltar que estou usando apenas o laravel sem nenhum tipo de pacote e estou usando o eloquent nas suas configurações padrão.

No exemplo a cima eu removi as configurações de token e adicionei um guard admin.

Providers

‘providers’ => [
 ‘users’ => [
 ‘driver’ => ‘eloquent’,
 ‘model’ => App\User::class,
 ],
 ‘admins’ => [
 ‘driver’ => ‘eloquent’,
 ‘model’ => App\Admin::class,
 ],
 ]

Todos os drivers de autenticação têm um provedor de usuário. Isso define como os usuários são realmente recuperados de seu banco de dados ou outro armazenamento.
 
O laravel traz apenas a model User, portanto, adicionei a model Admin para poder cadastrar os administradores do sistema na tabela admins.

Redefinir Senhas

Você pode especificar várias configurações de redefinição de senha:

‘passwords’ => [
 ‘users’ => [
 ‘provider’ => ‘users’,
 ‘table’ => ‘password_resets’,
 ‘expire’ => 60,
 ],
 ‘admins’ => [
 ‘provider’ => ‘admins’,
 ‘table’ => ‘password_resets’,
 ‘expire’ => 60,
 ],
 ]

Como o foco do artigo não é a parte de redefinição de senhas eu vou pular para próxima parte, é deixar para um outro artigo.

Criar Model do Administrador

Por padrão o laravel disponibiliza uma model de usuário como exemplo [/app/User.php], portanto vamos duplicar esse arquivo, e renomear para Admin.php, depois abrir o arquivo e alterar o nome da classe para “class Admin”. Ao lado você pode conferir um exemplo de como ficará a classe.

Migration da tabela admins

A forma mais pratica de criar a tabela de administradores e duplicando a classe de migration de users que vem de exemplo do laravel.

Mão a obra: Acesse o diretório [/database/migration/] e observe que existe duas migrations:

2014_10_12_000000_create_users_table.php 2014_10_12_100000_create_password_resets_table.php

Os nomes do arquivos estão em inglês, mas é bem fácil de entender para que serve cada uma delas, create user, para criar a tabela de usuários e create password resets para redefinir a senha do usuário.

Duplique o arquivo que serve para criar a tabela de usuários, e altere conforme a imagem:

  1. Altere o nome da classe
  2. Troque o nome da tabela de users para admins.
  3. Execute no terminal php artisan migrate.

Criar Usuário e Administrador padrão com seeder

Para que possamos acessar as áreas restritas do site é necessário termos usuários cadastrados, um para acessar como administrador e outro para acessar como usuário. A melhor forma de fazer isso é utilizar seeder, e farei isso da maneira mais simples possível. Vamos lá!

Abra o arquivo [/databases/seeds/DatabaseSeeder.php], e configure conforme a imagem ao lado, depois basta executar na linha de comando php artisan db:seed.

Criando as Rotas

Agora é necessário criarmos nossas rotas para autenticação de usuários:

//Rota para redirecionar quando autenticado
Route::get(‘/admin’, ‘LoginController@index’);

//Rota que exibirá um formulário de login, caso usuário não esteja autenticado.
Route::get(‘/admin’, ‘LoginController@index’);

//Rota para deslogar
Route::get(‘/admin/logout’, ‘LoginController@logout’)

//Rota POST para envio de autenticação
Route::get(‘/admin’, ‘LoginController@postLogin’);

Padrão de rota do Laravel

O laravel fornece um padrão de rotas e acho que é a maneira mais correta de trabalhar, porém, nada impede de personalizar, como fiz a cima, segue o padrão que o laravel trabalha com complemento da área do admin.

Auth::routes();
Route::get(‘/home’, ‘HomeController@index’)->name(‘home’);

Route::group([‘prefix’ => ‘admin’, ‘as’ => ‘admin.’], function (){
 Route::get(‘/home’, ‘HomeController@index’)->name(‘home’);
 // Authentication Routes…
 $this->get(‘login’, ‘Auth\LoginController@showLoginForm’)->name(‘login’);
 $this->post(‘login’, ‘Auth\LoginController@login’);
 $this->post(‘logout’, ‘Auth\LoginController@logout’)->name(‘logout’);

// Password Reset Routes…
 $this->get(‘password/reset’, ‘Auth\ForgotPasswordController@showLinkRequestForm’)->name(‘password.request’);
 $this->post(‘password/email’, ‘Auth\ForgotPasswordController@sendResetLinkEmail’)->name(‘password.email’);
 $this->get(‘password/reset/{token}’, ‘Auth\ResetPasswordController@showResetForm’)->name(‘password.reset’);
 $this->post(‘password/reset’, ‘Auth\ResetPasswordController@reset’); 
});

Criar Controller

Já temos as rotas criadas, mas ainda, não temos o controller que será associado a estas rotas, para ficar melhor organizado eu gosto de criar dentro de uma pasta, para isso, dentro da pasta /app/Http/Controllers adicione uma nova pasta e renomei para Admin.

Para criar o controller vamos utilizar o artisan executando o seguinte comando:

php artisan make:controller Admin/LoginController
One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.