Autorisation
L'autorisation est obligatoire pour toute action sensible.
:::danger Règle fondamentale Les vérifications UI ne sont pas de l'autorisation. Toujours appliquer les permissions côté serveur. :::
Mécanismes approuvés
| Mécanisme | Usage |
|---|---|
| Laravel Policies | Autorisation par modèle (UserPolicy, ApplicationPolicy…) |
| Gates | Autorisations globales non liées à un modèle |
| Middleware de permission | Vérification au niveau de la route |
| Vérifications business post-autorisation | Règles métier dans le service après OK contrôleur |
Pattern contrôleur
// ✅ BIEN
public function update(UpdateUserRequest $request, User $user): RedirectResponse
{
$this->authorize('update', $user);
$this->userService->update($user, $request->validated());
return redirect()->route('admin.users.edit', $user);
}
// ❌ MAL
public function update(Request $request, User $user): RedirectResponse
{
if (auth()->user()->role === 'admin') {
$user->fill($request->all())->save();
}
}
Pattern Blade
{{-- ✅ Correct — pour l'affichage uniquement --}}
@can('delete', $user)
<button class="btn btn-danger btn-sm">Supprimer</button>
@endcan
{{-- ❌ Jamais le seul contrôle de sécurité --}}
@if(auth()->user()->is_admin)
<button>Supprimer</button>
@endif
Ordre obligatoire dans le contrôleur
public function destroy(User $user): RedirectResponse
{
// 1. Autorisation
$this->authorize('delete', $user);
// 2. Appel service (qui peut faire d'autres vérifications métier)
$this->userService->delete($user);
// 3. Réponse
return redirect()->route('admin.users.index')
->with('success', 'Utilisateur supprimé.');
}