« Mise en place des rôles sur Laravel » : différence entre les versions
| Ligne 153 : | Ligne 153 : | ||
</syntaxhighlight>Si aucun middleware de gestion de rôle n'est présent, vous pouvez en créer un : <syntaxhighlight lang="sh"> | </syntaxhighlight>Si aucun middleware de gestion de rôle n'est présent, vous pouvez en créer un : <syntaxhighlight lang="sh"> | ||
php artisan make:middleware CheckRole | php artisan make:middleware CheckRole | ||
</syntaxhighlight>Ensuite vous pourrez le remplir comme indiqué | </syntaxhighlight>Ensuite vous pourrez le remplir comme indiqué précédemment et qu'il soit intégré par votre application il faudra le mentionner dans votre fichier <code>/App/Http/Kernel.php</code> en ajoutant au tableau '''$middlewareAliases''' ou '''$routeMiddleware''' la ligne suivante :<syntaxhighlight lang="php"> | ||
'checkrole' => \App\Http\Middleware\CheckRole::class | 'checkrole' => \App\Http\Middleware\CheckRole::class | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Voilà, à partir de là, vous pouvez créer des routes qui ne sont accessibles qu'à certains roles :<syntaxhighlight lang="php"> | |||
// Routes accessibles aux students | |||
Route::middleware(["auth:sanctum", "checkrole:student"])->group(function () { | |||
// Route pour récupérer les informations de l'utilisateur connecté | |||
Route::get('/user', function (Request $request) { | |||
return $request->user(); | |||
}); | |||
}); | |||
</syntaxhighlight> | |||
== Categories == | == Categories == | ||
[[ | [[index.php?title=Catégorie:Laravel]] | ||
Version du 23 mars 2024 à 18:12
Ce tuto à été réalisé avec Laravel 10.*
Nous allons utiliser la bibliothèque Spatie pour la gestion des rôle et des permissions. La documentation officielle est très bien faite (https://spatie.be/index.php/docs/laravel-permission/v6) :
Installation :
composer require spatie/laravel-permission
Ajouter le service provider dans le fichier config/app.php si cela n'est pas déjà fait automatiquement :
'providers' => [
// ...
Spatie\Permission\PermissionServiceProvider::class,
];
Publier la migration
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
A ce stade et avant de lancer la migration, vous pouvez choisir d'implémenter des fonctionnalités pour gérer de équipes (voir https://spatie.be/index.php/docs/laravel-permission/v6/installation-laravel)
Effacer le cache
php artisan optimize:clear
# or
php artisan config:clear
Lancer la migration
php artisan migrate
Modifier le modèle User
use HasRoles; doit être ajouté aux traits du Modèle User;
Créer les rôles (et permissions) avec une migration
Créer une migration
php artisan make:migration CreateRoles
Ouvrir le fichier de migration afin d'y apporter les modification voulus
(ici juste la création des rôles admin et user, pour plus d'options voir la documentation officielle de Spatie https://spatie.be/index.php/docs/laravel-permission/v6/basic-usage/basic-usage )
use Illuminate\Database\Migrations\Migration;
use Spatie\Permission\Models\Role;
class CreateRoles extends Migration
{
public function up()
{
// Création du rôle "admin"
Role::create(['name' => 'admin']);
// Création du rôle "user"
Role::create(['name' => 'user']);
}
public function down()
{
// Supprimer les rôles si nécessaire
Role::where('name', 'admin')->delete();
Role::where('name', 'user')->delete();
}
}
Lancer la migration
php artisan migrate
Assigner les rôles lors de l'inscription
Vous pouvez maintenant modifier votre controller d'inscription pour assigner un rôle par défaut aux utilisateurs. Voici un exemple:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class RegisterController extends Controller
{
public function register(Request $request): \Illuminate\Http\JsonResponse
{
// Validate request
$request->validate([
'name' => 'required|string',
'email' => 'required|email|unique:users,email',
'password' => 'required|min:8',
]);
// Create user
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
// Assign roles
$user->assignRole('user'); // Assign user role by default
// Assign admin role to the first user
if ($user->id == 1) {
$user->assignRole('admin');
}
return response()->json(['message' => 'Registration successful', 'user' => $user]);
}
}
Modifier le middleware s'occupant des vérifier les rôles
Si vous avez un middleware s'occupant de vérifier les rôles, vous pourrez le modifier pour utiliser la vérification par Spatie.
Voici un exemple avec le middleware CheckRole.php :
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Spatie\Permission\Exceptions\UnauthorizedException;
class CheckRole
{
/**
* Handle an incoming request.
*
* @param Closure(Request): (Response) $next
*/
public function handle(Request $request, Closure $next, ...$roles)
{
$user = Auth::user();
// Vérifie si l'utilisateur a au moins l'un des rôles requis
foreach ($roles as $role) {
if ($user->hasRole($role)) {
return $next($request);
}
}
throw UnauthorizedException::forRoles($roles);
}
}
Si aucun middleware de gestion de rôle n'est présent, vous pouvez en créer un :
php artisan make:middleware CheckRole
Ensuite vous pourrez le remplir comme indiqué précédemment et qu'il soit intégré par votre application il faudra le mentionner dans votre fichier /App/Http/Kernel.php en ajoutant au tableau $middlewareAliases ou $routeMiddleware la ligne suivante :
'checkrole' => \App\Http\Middleware\CheckRole::class
Voilà, à partir de là, vous pouvez créer des routes qui ne sont accessibles qu'à certains roles :
// Routes accessibles aux students
Route::middleware(["auth:sanctum", "checkrole:student"])->group(function () {
// Route pour récupérer les informations de l'utilisateur connecté
Route::get('/user', function (Request $request) {
return $request->user();
});
});
