Laravel Middleware: Adicione segurança e personalização às suas requisições HTTP

Laravel

Introdução

Middleware no Laravel age como um intermediário que gerencia as solicitações feitas em seu site. Em vez de ir diretamente para onde as coisas acontecem (o controller), a solicitação passa primeiro por esse Middleware. Em termos mais simples, é como uma verificação rápida que acontece antes da sua solicitação chegar ao destino final.

Pense na sua solicitação como um pacote que precisa ser entregue. O Middleware é como um ponto de controle que verifica se o pacote está em conformidade com algumas regras antes de ser processado. Essas regras podem incluir coisas como verificar se você está autenticado, se tem permissão para acessar determinadas áreas e assim por diante.

Como o Middleware se encaixa no fluxo de requisição HTTP:

Quando alguém acessa seu site (faz uma requisição HTTP, como clicar em um link), essa solicitação passa por diversas etapas até chegar ao destino final, que geralmente é um controller no Laravel. O Middleware é como um guarda no meio desse caminho.

A sequência básica de uma requisição HTTP no Laravel é mais ou menos assim:

  1. Requisição HTTP:
    • Alguém clica em um link ou faz qualquer tipo de solicitação para o seu site.
  2. Middleware:
    • Antes da solicitação chegar ao controller, ela passa por uma série de Middlewares (se configurados).
    • Cada Middleware pode realizar verificações específicas ou adicionar/modificar algo na solicitação.
  3. Controller:
    • Após passar pelos Middlewares, a solicitação chega ao controller, que é responsável por processar a solicitação e fornecer uma resposta.
  4. Resposta HTTP:
    • O controller gera uma resposta que é enviada de volta ao navegador do usuário.

Você pode checar esse outro post onde eu mostro em mais detalhes esse fluxo. Mas então, o Middleware é essa camada intermédia que tem a oportunidade de verificar ou modificar a solicitação antes que ela atinja o controller. Isso é útil para adicionar medidas de segurança, verificar autenticação, modificar cabeçalhos HTTP, entre outras coisas, dependendo das necessidades do seu aplicativo. Ele se encaixa como um guardião entre a chegada da requisição e o processamento pelo controlador, permitindo a implementação de lógica adicional no fluxo padrão de uma requisição HTTP no Laravel.

Como criar Middleware em Laravel

Passo 1: Criando o Middleware

Ok, existem duas formas de criar o seus middlewares, a primeira é criando a classe manualmente dentro da pasta app/Http/Middleware. A segunda, e bem mais fácil, é criar utilizando o comando artisan, que exatamente o que vamos fazer aqui.

Abra o terminal e digite o seguinte comando para criar um novo Middleware chamado VerificaAssinatura:

php artisan make:middleware VerificaAssinatura

Este comando cria um arquivo chamado VerificaAssinatura.php no diretório app/Http/Middleware.

Passo 2: Personalizando o Middleware

Dentro dessa classe você vai encontrar apenas um método, handle(). Este método é executado antes que a solicitação alcance seu destino. É nessa classe que nós vamos adicionar as verificações que queremos fazer.

Nesse middleware, eu vou verificar se o usuário está logado e se a assinatura desse usuário ainda está ativa, se tudo estiver certo, o requisição segue adiante, caso contrário a gente redireciona o usuário para a tela de renovação de assinatura ou se você estive usando uma API, você pode retornar um erro HTTP com o código 401.

<?php

namespace App\Http\Middleware;

use Closure;

class VerificaAssinatura
{
    public function handle($request, Closure $next)
    {
        // Verifica se o usuário está logado e tem uma assinatura ativa
        if (auth()->check() && !auth()->user()->assinaturaAtiva()) {
            return redirect('/renove-sua-assinatura');
        }

        // Se estiver tudo certo, continua com a solicitação
        return $next($request);
    }
}

Passo 3: Registrando o Middleware

Você precisa manualmente registrar o seu middleware pra você começar utiliza-lo. Pra registrar, é bem simples. Abra o arquivo app/Http/Kernel.php e adicione o seu Middleware ao array $routeMiddleware:

protected $routeMiddleware = [
    // ... outros middlewares ...
    'verifica.assinatura' => \App\Http\Middleware\VerificaAssinatura::class,
];

Passo 4: Aplicando o Middleware em Rotas

Agora, você pode aplicar o Middleware às rotas desejadas. Abra seu arquivo de rotas (web.php geralmente) e adicione o Middleware utilizando o helper ->middleware():

Route::get('/area-restrita', [AreaRestritaController::class,'index'])->middleware('verifica.assinatura');

Isso significa que sempre que alguém tentar acessar a rota /area-restrita, o Middleware VerificaAssinatura será acionado antes de permitir ou negar o acesso.

Tipos de Middleware no Laravel

Middleware Global vs. Middleware de Rota vs. Middleware de Grupo

No Laravel, existem três tipos de middleware: global, de rota e de grupo. Cada um tem uma função diferente, e a escolha do tipo certo depende das necessidades do seu app ou site. Aqui, vou explicar as diferenças entre eles pra te ajudar a escolher o que é melhor pra sua aplicação.

Middleware Global:

No contexto do Laravel, um Middleware Global é como uma verificação geral que ocorre em todas as solicitações antes de chegarem aos controladores.

Por exemplo, um Middleware Global pode ser usado para verificar se o usuário está logado. Se o usuário não estiver logado, o Middleware Global pode redirecionar o usuário para a página de login.

Outro exemplo de Middleware Global é um Middleware que registra todas as solicitações recebidas pelo aplicativo em um Log, esse Middleware pode ser usado para fins de análise de desempenho ou segurança.

Por exemplo vamos criar um Middleware Global que verifica o idioma da aplicação e ajusta dinamicamente o idioma da resposta para o usuário. Suponha que você tenha diferentes traduções disponíveis em sua aplicação e deseja garantir que a resposta seja enviada no idioma correto.

// Em app/Http/Middleware/SetLanguage.php
namespace App\Http\Middleware;

use Closure;

class SetLanguage
{
    public function handle($request, Closure $next)
    {
        // Verificar a preferência de idioma do usuário ou usar um padrão
        $preferredLanguage = $request->getPreferredLanguage(['en', 'es']);

        // Configurar o idioma da aplicação
        app()->setLocale($preferredLanguage);

        // Continuar com a solicitação
        return $next($request);
    }
}

Agora para registrar e aplicar esse middleware globalmente, dentro do arquivo app/Http/Kernel.php você vai registrar esse middleware dentro da variável $middleware:

protected $middleware = [
    // ... outros middlewares ...
    \App\Http\Middleware\SetLanguage::class,
];

Middleware de Rota:

O middleware de Rota já é mais específico. Ele é aplicado apenas às rotas que você escolher.

Se você quiser só verificar se um usuário está autenticado antes de acessar uma determinada rota, você primeiro, claro, vai criar um Middleware, CheckAuthentication por exemplo:

php artisan make:middleware CheckAuthentication

// Em app/Http/Middleware/CheckAuthentication.php
public function handle($request, Closure $next)
{
    if (auth()->guest()) {
        return redirect()->route('login');
    }

    return $next($request);
}

E lembra que você precisa registrar esse novo middleware no app/Http/Kernel.php também, mas diferentemente do middleware global, esse middleware você vai registrar na variável $routeMiddleware:

protected $routeMiddleware = [
    // ... outros middlewares ...
    'auth.check' => \App\Http\Middleware\CheckAuthentication::class,
];

Daí então, você pode aplicar esse Middleware em rotas específicas, utilizando o helper ->middleware():

Route::get('/dashboard', 'DashboardController@index')->middleware('auth.check');

Middleware de Grupo:

O middleware de Grupo no Laravel é um jeito de agrupar verificações que você quer aplicar a várias rotas ao mesmo tempo.

O middleware de Grupo é uma forma de centralizar a lógica de autorização do seu aplicativo. Isso torna seu código mais fácil de manter e entender.

Por exemplo, você pode ter um middleware de Grupo que verifica se o usuário está logado e uma outra que verifica se o usuário é um admin, como já temos um middleware que verifica se o usuário está autenticado, só vamos criar mais um para verificar se o usuário é uma admin.

Pra criar um middleware de grupo, a gente segue o mesmo passo a passo, criando a classe manualmente ou rodando o comando artisan.

php artisan make:middleware CheckAdmin

// Em app/Http/Middleware/CheckAdmin.php
public function handle($request, Closure $next)
{
    if (!auth()->user()->isAdmin()) {
        return abort(403, 'Acesso negado! Você não é um administrador.');
    }

    return $next($request);
}

A diferença fica na hora de registrar esse middleware no app/Http/Kernel.php. Dentro do Kernel, você vai encontrar a variável, $middlewareGroups, nessa variável você provavelmente já vai ter definido alguns middlewares do próprio Laravel.

Aqui você pode tanto criar um novo grupo, ou adicionar o middleware que você acabou de criar em um dos grupos que já existem. Aqui eu criei um novo grupo chamado admin onde vou adicionar os dois middlewares.

protected $middlewareGroups = [
    'web' => [
        // ... outros middlewares ...
    ],

    'admin' => [
        \App\Http\Middleware\CheckAdmin::class,
        \App\Http\Middleware\CheckAuthentication::class,
    ],
];

E então, você aplica esse grupo de Middleware às suas rotas. Aqui você vai usar o helper ->middleware() em junção com o helper group(), que aceita uma método callback, onde dentro desse método, você vai passar todas as rotas ao qual você quer aplicar o seus middlewares.

Route::middleware(['admin])->group(function () {
    //
});

Conclusão

Bora resumir o que a gente viu sobre middleware no Laravel:

  • O middleware é um intermediário nas solicitações do seu site. Ele fica entre o início da solicitação e o destino final, dando uma olhadinha rápida antes de passar a solicitação para o controller.
  • Existem três tipos de middleware: global, de rota e de grupo.
  • O middleware global é aplicado a todas as solicitações. Ele é bom para tarefas que precisam ser executadas em todas as solicitações, como autenticação e autorização.
  • O middleware de rota é aplicado a apenas algumas solicitações. Ele é bom para tarefas que precisam ser executadas em rotas específicas, como verificação de integridade ou redirecionamento.
  • O middleware de grupo é um conjunto de middlewares que podem ser aplicados a várias rotas ao mesmo tempo. Ele é bom para tarefas que precisam ser executadas em várias rotas, como verificação de autorização.

Além disso, vimos como criar um middleware personalizado. É bem simples:

  1. Crie um arquivo com a extensão .php na pasta app/Http/Middleware.
  2. Extenda a classe Illuminate\Foundation\Http\Middleware\Middleware.
  3. Sobrescreva o método handle().

Entendendo esses conceitos, você estará pronto para implementar estratégias eficazes de controle e personalização no fluxo de requisições HTTP do seu aplicativo Laravel.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

0 Comments