Olá Pessoal! Estou de volta para continuar nossos estudos sobre o Laravel. No último artigo eu trouxe os form validations, para validarmos todo tipo de entrada em formulários para os usuários. Agora, vamos dar um pulo na segurança do projeto, configurando Middlewares para as requisições que serão feitas.
No caso utilizarei o Middleware de autenticação do Laravel para verificar se um usuários do sistema está autenticado.
Tópicos
O que são os Middlewares no Laravel?
O Middleware é apenas um mecanismo de filtragem de requisição HTTP. Ou seja, ele permite ou barra determinados fluxos de requisição que entram na sua aplicação, baseado em regras definidas.
Dando um exemplo prático, o Middleware de autenticação do Laravel verifica se um usuário está autenticado no sistema. Caso não esteja, o sistema barra a requisição antes mesmo de chegar ao Controller.
O Middleware de autenticação do Laravel é considerado de rota, mas, ainda existem outros 2 tipos: os Middlewares globais e os grupos de Middlewares, que falarei a seguir.
Middlewares Globais
Como o nome já implica, o Middleware global intermediará toda requisição HTTP. Assim, só é recomendado utilizar, caso todo o seu sistema necessite de autenticação para funcionar. Mas, como a nossa página de login, signup e etc não serão autenticadas, não utilizaremos este método.
Agora, caso você precise fazer alguma regra para ser aplicada globalmente, basta adicionar Middleware criado na propriedade $middleware
no arquivo app/Http/Kernel.php
class Kernel extends HttpKernel { /** * The application's global HTTP middleware stack. * * These * middleware are run during every request to your application. * * @var * array */ protected $middleware = [ \App\Http\Middleware\CheckForMaintenanceMode::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class \App\Http\Middleware\TrustProxies::class, \App\Http\Middleware\SuaClasseMiddleware::class, ]; …
Grupos de Middlewares
Os grupos de Middlewares servem para você conseguir colocar várias regras de Middlewares diferentes sendo utilizadas de uma vez para toda requisição dentro do grupo especificado.
Por padrão, toda requisição de browser estará inclusa nas requisições web, ou seja, todas as rotas que estão no arquivo web.php
, passarão pela validação do grupo web que se encontra no Kernel.php
. Por este motivo, também não configurarei a classe Authenticate
aqui.
Middleware de rotas
O Middleware de rota é a forma mais específica que você pode criar. Ele é aplicado no Kernel.php
com um label dentro da propriedade $routeMiddleware
. Neste exemplo, vou utilizar o auth
para fazer a autenticação de login.
Fazendo o Migration de usuários
Em nosso exemplo utilizarei este modelo. Assim, vou definir que a tela de login não necessitará do Middleware.
A primeira coisa a fazer aqui, é criar uma tabela nova de usuários. O Laravel já disponibiliza uma por padrão. Neste caso, vou utilizá-la, mas, você pode criar uma com os seus próprios padrões.
Então, voltando aos migrations, vou pegar os arquivos create_users_table
e create_password_resets_table
para criar as tabelas de login. Se tudo der certo em sua migração, você terá as duas novas tabelas para implementarmos o login.
Definindo um Middleware por rota
Agora, temos que criar as views e rotas para o login e cadastro. Neste ponto, o Laravel também já pensou para nós, e, ao rodar o comando php artisan make:auth
, você verá que seu projeto ganha automaticamente alguns arquivos:
app/Http/Controllers/HomeController.php
resources/Http/Controllers/auth/
resources/views/auth
No arquivo de rotas web.php
você verá uma rota específica de autenticação Auth::routes();
. Essa linha já engloba as rotas de login, logout, reset password, forgot password e register.
Além disso, será registrada uma rota para /home
apontando para HomeController@index
. Aqui eu vou fazer algumas modificações:
- Primeiro, vou reapontar o
/home
para/
, na rota. - Vou trocar a definição do
HomeController@index
, na rota, para aProductsController@index
. - Especificamente para este projeto vou apontar as variáveis
$redirectTo
, da ControllerLoginController
,RegisterController
,ResetPasswordController
eVerificationController
para/
. - No Middleware
RedirectIfAuthenticated
também vou fazer a alteração do/home
para/
.
Essas modificações são porque eu não quero ter uma rota home, já que ela será a própria raiz do meu domínio.
Se você está um pouco perdido com relação as rotas leia o artigo sobre Controllers que eu fiz há um tempo atrás. Nele eu explico sobre o registro de rotas no Laravel.
Agora que todos os redirecionamentos e rotas foram criados, só preciso adicionar o Middleware auth nas rotas. Para isso existem 2 maneiras.
A primeira é adicionando rota a rota, como mostro abaixo:
Route::get('/', 'ProductsController@index')->name('home')->middleware('auth');
A segunda é adicionando um Route::group
que conterá o Middleware e que abraçará todas as rotas que eu quero proteger com a autenticação. Dessa forma, nosso arquivo web.php
ficará assim:
'auth'], function() { Route::get('/', 'ProductsController@index')->name('home'); Route::get('product_lines','ProductLinesController@index')->name('product_line_index'); Route::get('product_lines/{product_line}','ProductLinesController@show')->name('product_line_show'); Route::post('product_lines/{product_line}/add_product','ProductLinesController@productStore')->name('product_line_product_store'); Route::get('products','ProductsController@index')->name('product_index'); Route::post('products','ProductsController@store')->name('product_store'); Route::get('products/{product}','ProductsController@show')->name('product_show'); Route::get('products/{product}/edit','ProductsController@edit')->name('product_edit'); Route::patch('products/{product}','ProductsController@update')->name('product_update'); Route::get('products/{product}/delete','ProductsController@delete')->name('product_delete'); });
Se você ainda não está acreditando que foi tão fácil adicionar uma validação com sessão de login utilizando Middlewares no Laravel, não se debata. Essa configuração abstrai toda a complexidade de fazer uma session start, validar usuário e senha, e até mesmo, criar uma view do zero.
Concluindo
Os Middlewares foram implementados no Laravel, para fazer todo o meio de campo entre o início da Request e a chegada na Controller. Assim, conseguimos filtrar e garantir mais segurança no tráfego dos dados dentro do sistema.
O exemplo acima, foi uma implementação básica que acredito existir em 90% dos sistemas web hoje. O mais importante aqui é você entender o conceito por traz do Middleware, e, sempre que precisar filtrar ou proteger uma requisição, saber que o Middleware está lá para servi-lo.
Como sempre, deixo o tema que vou estudar e compartilhar com vocês. Para o próximo artigo, vou trabalhar com dados na sessão e ver como acessar os dados do meu usuário. Até lá! 😉