Back-End

9 nov, 2018

Adicionando segurança no Laravel

Publicidade

Em um outro artigo, eu falei sobre os form validations para validarmos entrada em formulários. Hoje, vamos dar um pulo na segurança do projeto configurando Middlewares para as requisições que serão feitas, utilizando o Middleware de autenticação do Laravel para verificar se um usuários do sistema está autenticado.

O que são os Middlewares?

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 ele não esteja, o sistema barra a requisição antes mesmo de chegar ao Controller.

Grupos de Middlewares

Os grupos de Middlewares servem para 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.

Middlewares globais

Como o nome já implica, o Middleware global intermediará toda requisição HTTP. Assim, só é recomendado se todo o seu sistema necessitar de autenticação para funcionar. Mas como a nossa página de login, signup e etc não devem ser autenticadas, não utilizaremos este método.

Caso você precise fazer alguma regra para ser aplicada globalmente, basta adicionar Middleware criado na propriedade $middleware no arquivo app/Http/Kernel.php

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. Em nosso exemplo, vamos utilizar o auth para fazer a autenticação de login.

Setando o Middleware de rota

A primeira coisa a fazer aqui é criar uma tabela nova de usuários. O Laravel já disponibiliza uma por padrão. Neste exemplo, vou utilizá-la, mas você pode criar uma com os seus próprios padrões.

Então, voltando aos migrations ,vou utilizar 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.

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 ganhou alguns arquivos em Controllers e Views.

No arquivo de rotas, web.php, você verá uma rota específica de autenticação Auth::routes();. Esta linha traz 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 re-apontar o /home para /, na rota;
  • Além disso, vou trocar a definição do HomeController@index, na rota, para a ProductsController@index;
  • Especificamente para este projeto, vou apontar as variáveis $redirectTo, da Controller LoginController, RegisterController, ResetPasswordController e VerificationController 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 às rotas, siga o artigo sobre Controllers que eu fiz há um tempo. Nela eu explico sobre o registro de rotas no Laravel.

Agora que todos os redirecionamentos e rotas foram criados, eu só preciso adicionar o Middleware auth nas rotas. Para isso, vou adicionar um <code>Route::group</code> que conterá o Middleware e que abraçará todas as rotas que eu quero proteger com a autenticação. Desta forma, nosso arquivo <code>web.php</code> ficará assim:

<?php

Auth::routes();

Route::group(['middleware' => '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');
});

Esta configuração abstrai toda a complexidade de fazer um session start, de validar usuário e senha e até mesmo de criar uma view do zero.

Concluindo

O exemplo acima, foi uma implementação básica. O mais importante aqui, é entender o conceito por trás do Middleware, e sempre que precisar filtrar ou proteger uma requisição, você saber que ele está lá para servi-lo.

Para o próximo artigo, vou trabalhar com dados na sessão e ver como acessar dados do meu usuário.