Optimaliseer mijn Laravel API met middleware en authenticatie
description
Met deze prompt krijg je een specifieke middleware-oplossing en een passend authenticatiesysteem voor je Laravel backend. Het helpt je API veiliger te maken en routes effectief te beheren, wat verbeterde controle en veiligheid biedt ten opzichte van generieke oplossingen.
prompt
Help me mijn Laravel API te verbeteren door een middleware te ontwerpen die <beschrijf de functionaliteit van de middleware> uitvoert en integreer een authenticaties ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is hoe je een middleware kunt maken die controleert of de gebruiker een admin is, en hoe je JWT-authenticatie integreert in Laravel.
### 1. Installeer JWT-authenticatie
Gebruik bijvoorbeeld het populaire package `tymon/jwt-auth`:
```bash
composer require tymon/jwt-auth
```
Publiceer de configuratie:
```bash
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
```
Stel je `config/jwt.php` in indien nodig. Voeg de JWT middleware toe aan je `api` middleware groep in `app/Http/Kernel.php`:
```php
protected $middlewareGroups = [
'api' => [
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
'auth:api', // backend JWT middleware
],
];
```
### 2. Maak een middleware om te controleren of de gebruiker een admin is
Gebruik artisan om de middleware te maken:
```bash
php artisan make:middleware IsAdmin
```
Vul de middleware in `app/Http/Middleware/IsAdmin.php`:
```php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Tymon\JWTAuth\Facades\JWTAuth;
class IsAdmin
{
public function handle(Request $request, Closure $next)
{
$user = JWTAuth::parseToken()->authenticate();
if (!$user || !$user->is_admin) {
return response()->json(['message' => 'Toegang geweigerd'], 403);
}
return $next($request);
}
}
```
Hier wordt ervan uitgegaan dat je model een `is_admin` boolean attribuut heeft.
### 3. Registreer de middleware
In `app/Http/Kernel.php` voeg je de middleware toe aan `$routeMiddleware`:
```php
protected $routeMiddleware = [
// andere middleware
'is_admin' => \App\Http\Middleware\IsAdmin::class,
];
```
### 4. Route-beveiliging toepassen
Voor je routes `/api/user` en `/api/profile`, kun je de middleware toevoegen in `routes/api.php`:
```php
use Illuminate\Support\Facades\Route;
Route::middleware(['auth:api', 'is_admin'])->group(function () {
Route::get('/user', [UserController::class, 'index']);
Route::get('/profile', [ProfileController::class, 'show']);
});
```
Of, als je ze apart wilt beveiligen:
```php
Route::get('/user', [UserController::class, 'index'])->middleware(['auth:api', 'is_admin']);
Route::get('/profile', [ProfileController::class, 'show'])->middleware(['auth:api', 'is_admin']);
```
### Samenvatting
- Installeer JWT-authenticatie.
- Configureer JWT en authenticatiemiddleware.
- Maak een middleware `IsAdmin` die controleert op `is_admin`.
- Registreer de middleware en pas deze toe op de gewenste routes.
Zo heb je een beveiligd API-systeem dat controleert op JWT_authenticatie en adminrechten!
provider: deepseek
model: deepseek-chat
Zeker, ik help je graag met het verbeteren van je Laravel API. Hier is een complete handleiding:
## 1. JWT Authenticatie Installeren
Installeer eerst het JWT package:
```bash
composer require tymon/jwt-auth
```
Publish de configuratie:
```bash
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
```
Genereer JWT secret key:
```bash
php artisan jwt:secret
```
## 2. User Model Aanpassen
Pas je `User.php` model aan:
```php
<?php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Tymon\JWTAuth\Contracts\JWTSubject;
class User extends Authenticatable implements JWTSubject
{
// ... bestaande code
public function getJWTIdentifier()
{
return $this->getKey();
}
public function getJWTCustomClaims()
{
return [];
}
// Voeg een methode toe om admin status te controleren
public function isAdmin()
{
return $this->role === 'admin'; // Pas aan naar je eigen rol veld
}
}
```
## 3. Admin Middleware Maken
Maak een nieuwe middleware:
```bash
php artisan make:middleware AdminMiddleware
```
Pas de middleware aan in `app/Http/Middleware/AdminMiddleware.php`:
```php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Tymon\JWTAuth\Facades\JWTAuth;
class AdminMiddleware
{
public function handle(Request $request, Closure $next): Response
{
try {
$user = JWTAuth::parseToken()->authenticate();
if (!$user) {
return response()->json(['error' => 'Gebruiker niet gevonden'], 404);
}
if (!$user->isAdmin()) {
return response()->json(['error' => 'Geen administrator rechten'], 403);
}
} catch (\Exception $e) {
return response()->json(['error' => 'Ongeldig token of niet geautoriseerd'], 401);
}
return $next($request);
}
}
```
## 4. Middleware Registreren
Registreer de middleware in `app/Http/Kernel.php`:
```php
protected $routeMiddleware = [
// ... bestaande middlewares
'admin' => \App\Http\Middleware\AdminMiddleware::class,
'jwt.auth' => \Tymon\JWTAuth\Http\Middleware\Authenticate::class,
];
```
## 5. Routes Beveiligen
Pas je routes aan in `routes/api.php`:
```php
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UserController;
use App\Http\Controllers\ProfileController;
// Open routes (zonder authenticatie)
Route::post('/login', [AuthController::class, 'login']);
Route::post('/register', [AuthController::class, 'register']);
// Beveiligde routes met JWT en admin rechten
Route::middleware(['jwt.auth', 'admin'])->group(function () {
Route::get('/api/user', [UserController::class, 'index']);
Route::get('/api/profile', [ProfileController::class, 'index']);
});
// Alternatief: individueel toepassen per route
Route::get('/api/user', [UserController::class, 'index'])
->middleware(['jwt.auth', 'admin']);
Route::get('/api/profile', [ProfileController::