doganddev
Accueil Blog Boutique

Laravel Prohibitions : sanctions temporaires et restrictions d’actions

DOG&DEV · 25/01/2025

Systèmes d'Exploitation Web Hosting
Laravel Prohibitions : sanctions temporaires et restrictions d’actions

Laravel Prohibitions : sanctions temporaires et restrictions d’actions

Laravel Prohibitions (kyrch/laravel-prohibitions) permet d’appliquer des restrictions temporaires à un utilisateur : interdiction d’envoyer des messages, de commenter ou de rejoindre un groupe pour une durée donnée. Les règles sont stockées en base, modifiables sans déploiement, et s’intègrent aux Gates et Policies Laravel. Idéal pour la modération, le respect de limites (rate limiting) ou les mises à l’écart temporaires.

Prérequis

  • Laravel 10+ (ou 11/12)
  • PHP 8.1+
  • Composer

1. Installation

composer require kyrch/laravel-prohibitions
php artisan vendor:publish --tag="laravel-prohibitions-migrations"
php artisan migrate

Fichier de configuration (optionnel) :

php artisan vendor:publish --tag="laravel-prohibitions-config"

2. Activer les sanctions sur le modèle

Ajoutez le trait HasSanctions au modèle qui peut être sanctionné (souvent User) :

use Kyrch\Prohibition\Traits\HasSanctions;

class User extends Authenticatable
{
    use HasSanctions;
}

3. Prohibitions et sanctions

  • Prohibition : une action interdite (ex. send message, create comment).
  • Sanction : un groupe de prohibitions appliqué en une fois (ex. « restriction communauté » = pas de message + pas de commentaire + pas de groupe).

Création des prohibitions et d’une sanction :

use Kyrch\Prohibition\Models\Prohibition;
use Kyrch\Prohibition\Models\Sanction;

$sendMessage = Prohibition::query()->create(['name' => 'send message']);
$createComment = Prohibition::query()->create(['name' => 'create comment']);
$joinGroup = Prohibition::query()->create(['name' => 'join group']);

$communitySanction = Sanction::query()->create(['name' => 'community restriction']);
$communitySanction->prohibitions()->attach([$sendMessage->id, $createComment->id, $joinGroup->id]);

4. Appliquer une restriction

Une prohibition avec date d’expiration :

// Interdire l’envoi de messages pendant une semaine
$user->prohibit('send message', now()->addWeek());

Une sanction (plusieurs prohibitions) :

$user->applySanction('community restriction', now()->addWeeks(2));

5. Vérifier si l’utilisateur est prohibé

Avant d’autoriser une action :

if ($user->isProhibitedFrom('send message')) {
    return response()->json(['error' => 'Vous êtes temporairement restreint pour cette action.'], 403);
}

6. Intégration avec l’autorisation Laravel

Pour centraliser la logique, utilisez Gate::before() :

use App\Models\User;
use Illuminate\Support\Facades\Gate;

Gate::before(function (User $user, string $ability) {
    if ($user->isProhibitedFrom($ability)) {
        return false;
    }
});

Ou dans une Policy, méthode before() :

public function before(User $user, string $ability): ?bool
{
    if ($user->isProhibitedFrom($ability)) {
        return false;
    }
    return null;
}

Ainsi, $this->authorize('send message') échouera automatiquement si l’utilisateur est prohibé.

7. Événements

Le package émet :

  • ModelProhibitionTriggered : lorsqu’une prohibition est appliquée
  • ModelSanctionTriggered : lorsqu’une sanction est appliquée

Vous pouvez les écouter pour journaliser la modération ou notifier l’utilisateur. Les événements sont désactivables dans la config.

Dépannage

Symptôme Cause possible Correctif
isProhibitedFrom toujours false Prohibition non créée ou nom différent Vérifier les noms en base (prohibitions) et les liaisons prohibitable
Les Gates ne bloquent pas Gate::before ou before() de Policy absent ou mal enregistré Vérifier AuthServiceProvider / AppServiceProvider et les Policies
Sanction qui ne s’applique pas Prohibitions non attachées à la sanction Vérifier la table pivot prohibition_sanction

Bonnes pratiques

  • Nommer les prohibitions de façon cohérente avec les abilities des Gates/Policies (send message, create comment).
  • Ne pas abuser des prohibitions sans expiration : privilégier une durée pour faciliter la modération et la révision.
  • Logger les applications de sanctions (événements) pour l’audit et le support.

Ressources


Cet article s’inscrit dans notre série de guides technique et développement web. Pour un serveur ou une application sur-mesure, contact.

Commentaires (0)

Laisser un commentaire