Laravel Prohibitions : sanctions temporaires et restrictions d’actions
DOG&DEV · 25/01/2025
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éeModelSanctionTriggered: 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
- Laravel News – Restrict User Actions with Time-Based Sanctions Using Laravel Prohibitions
- GitHub – kyrch/laravel-prohibitions
- Documentation Laravel – Authorization
Cet article s’inscrit dans notre série de guides technique et développement web. Pour un serveur ou une application sur-mesure, contact.