« Mise en place des rôles sur Laravel » : différence entre les versions
(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... ») |
Aucun résumé des modifications |
||
| Ligne 152 : | Ligne 152 : | ||
</syntaxhighlight> | </syntaxhighlight> | ||
[[Category:Laravel]] | |||
Version du 11 février 2024 à 19:41
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);
}
}
