Beim Stöbern im Laravel Breeze Starter Kit ist mir der RateLimiter aufgefallen. Ich war gerade dabei einen einfach passwortgeschützten Bereich zu implementieren und dachte schon darüber nach, dies von Hand zu implementieren. Nachdem die Funktionalität jedoch schon in Laravel implementiert ist, greife ich gerne darauf zurück. Wie sie sich einfach in einen Controller implementieren läßt, zeige ich in dem nachfolgenden Beispiel:

namespace App\Http\Controllers;
use Illuminate\Cache\RateLimiter;
use Illuminate\Http\Request;

class GeheimerBereichController extends Controller
{
    public function index(RateLimiter $limiter)
    {
        $key = "index";

        $limiter->hit($key, 30);

        if ($limiter->tooManyAttempts($key, 5)) {

            $availableAt = now()->addSeconds($limiter->availableIn($key))->ago();

            return abort(429);
        }

        return view('GeheimerBereich');
    }
}

Nachfolgend kurz erklärt:

$key = Das Merkmal welches als Identifier für die zu reglementierte Funktionalität genutzt werden soll. In dem oberen Beispiel geht es um die Darstellung der Index-Seite, daher habe ich als Key “index” gewählt, hätte auch jeden anderen Begriff wählen können.

$limiter->hit() = trackt die Verwendung des jeweiligen Keys und gibt gleichzeitig die Zeitspanne an, in der die Hits für Key gezählt werden, im oberen Beispiel sind es 30 Sekunden. Eine Stunde wäre bspw. 60*60.

$limiter->tooManyAttempts() = für welchen $key überprüft werden soll, ob die definierte Anzahl, in diesem Beispiel 5, bereits erreicht ist.

$availableAt = now()->addSeconds($limiter->availableIn($key))->ago(); berechnet nach welcher Zeit die Sperre vorbei ist.

return abort(429); = leitet auf das Standard 429 Template von Laravel weiter.

Abschließend der Hinweis, dass die Anfrage weiterhin den Webserver erreicht und von diesem verarbeitet wird. Damit die Anfrage schon vorher abgeblockt wird, sind weitere Einstellungen notwendig die an anderer Stelle erläutert sind.