A autenticação no Laravel é um dos recursos mais utilizados pelos desenvolvedores para garantir a segurança dos usuários. Entretanto, para evitar ataques de força bruta e acessos indevidos, é essencial implementar um rate limiter. Neste artigo, vamos explorar como configurar um sistema de autenticação seguro no Laravel com rate limiting, utilizando Laravel Breeze para autenticação e Blade para a interface no front-end.
O que é Rate Limiting no Laravel?
O Rate Limiting (limitação de taxa) é uma técnica usada para restringir o número de requisições que um usuário pode fazer em um determinado período de tempo. No Laravel, isso é implementado de forma simples com o middleware ThrottleRequests, que evita múltiplas tentativas de login seguidas, dificultando ataques de força bruta.
Pré-requisitos
Antes de começarmos, certifique-se de que você tem:
• Laravel 10 ou superior instalado
• Laravel Breeze para autenticação
• Um banco de dados configurado
• Node.js e npm instalados para a interface com Blade
Passo 1: Configurando a Autenticação no Laravel
Primeiro, vamos instalar o Laravel Breeze, um pacote oficial para autenticação simples.
composer require laravel/breeze --dev
php artisan breeze:install blade
npm install && npm run dev
php artisan migrate
Isso criará todo o sistema de autenticação, incluindo login, registro, recuperação de senha e logout, além de rotas e views em Blade.
Passo 2: Configurando o Rate Limiter no Laravel
Agora, vamos proteger a rota de login contra ataques de força bruta. No Laravel, o rate limiter pode ser configurado no arquivo routes/api.php ou diretamente no routes/web.php, caso o login seja realizado via web.
Abra o arquivo app/Providers/RouteServiceProvider.php e edite o método configureRateLimiting():
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Http\Request;
protected function configureRateLimiting()
{
RateLimiter::for('login', function (Request $request) {
return Limit::perMinute(5)->by($request->ip());
});
}
Neste caso, estamos limitando a 5 tentativas de login por minuto por IP.
Agora, vamos aplicar esse limitador à rota de login. No arquivo routes/web.php, adicione o middleware throttle:
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Auth\LoginController;
Route::post('/login', [LoginController::class, 'authenticate'])
->middleware('throttle:login');
Agora, se um usuário tentar realizar mais de 5 tentativas de login em menos de um minuto, ele receberá a seguinte resposta:
{
"message": "Too Many Attempts. Please try again later."
}
Passo 3: Criando a Interface do Login com Blade
Agora que a autenticação e o rate limiter estão configurados, vamos criar o formulário de login usando Blade.
Edite o arquivo resources/views/auth/login.blade.php e adicione o seguinte código:
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-6">
<div class="card">
<div class="card-header">Login</div>
<div class="card-body">
@if (session('status'))
<div class="alert alert-danger">{{ session('status') }}</div>
@endif
<form method="POST" action="{{ route('login') }}">
@csrf
<div class="form-group mb-3">
<label for="email">E-mail</label>
<input type="email" name="email" class="form-control" required autofocus>
</div>
<div class="form-group mb-3">
<label for="password">Senha</label>
<input type="password" name="password" class="form-control" required>
</div>
<button type="submit" class="btn btn-primary">Entrar</button>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
Este formulário básico envia os dados para a rota de login, que agora está protegida contra ataques de força bruta pelo Rate Limiter.
Passo 4: Testando o Rate Limiter
Após implementar o rate limiter, você pode testá-lo manualmente tentando inserir credenciais erradas repetidamente. Se exceder o limite de 5 tentativas por minuto, você verá a mensagem de erro.
Caso queira testar automaticamente, pode usar o Artisan Tinker:
php artisan tinker
E rodar uma simulação de múltiplos logins:
use Illuminate\Support\Facades\Http;
for ($i = 0; $i < 10; $i++) {
$response = Http::post(url('/login'), [
'email' => 'email@exemplo.com',
'password' => 'senhaerrada',
]);
echo $response->status() . "\n";
}
Você verá o status 429 (Too Many Requests) após algumas tentativas, indicando que o rate limiter está funcionando corretamente.
Conclusão
Implementar autenticação no Laravel com rate limiter é uma estratégia fundamental para proteger seu sistema contra ataques de força bruta. Utilizando o Laravel Breeze para facilitar a autenticação e Blade para a interface, criamos um sistema seguro e funcional.
✅ Como instalar e configurar autenticação com Laravel Breeze
✅ Como configurar rate limiting para rotas de login
✅ Como criar um formulário de login seguro com Blade
✅ Como testar a limitação de tentativas de login
Se você gostou deste conteúdo, compartilhe e continue explorando Laravel para tornar suas aplicações ainda mais seguras!