« Mise en place des rôles sur Laravel » : différence entre les versions

De Gandal
 
(2 versions intermédiaires par le même utilisateur non affichées)
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é précedemment 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">
</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>
[[index.php?title=Catégorie:Laravel]]
 
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>

Dernière version du 23 mars 2024 à 18:15

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