Mise en place des rôles sur Laravel

De Gandal
Révision datée du 11 février 2024 à 19:40 par Abdoulaye (discussion | contributions) (Page créée avec « ''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 : == <syntaxhighlight lang="bash"> composer require spatie/laravel-permission </syntaxhighlight> == Ajouter le service provider dans le fichier <code>config/app.php</code> si cela n'est pas déjà f... »)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

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);
    }
}