Laravel Nova : sécurité et policies (accès CRUD)
CRUD, filtres, actions et recherche : en quelques minutes, le back-office est déjà très complet. Il manque encore la brique essentielle d’un admin métier : qui peut faire quoi.
Laravel gère ça avec les policies. Nova, produit officiel Laravel, les réutilise automatiquement : viewAny, view, create, update, delete… sans overlay custom. En cas de conflit avec votre app métier, on peut isoler la logique Nova ou créer des policies dédiées — puis affiner les listes avec indexQuery().
Accès et sécurité : la dernière brique du CRUD
Jusqu’ici dans la playlist, on a monté très vite un back-office classique :
- deux ressources (CRUD) ;
- filtres et métriques ;
- actions en masse ;
- recherche globale et locale.
Ce qui manque encore ? La gestion des accès. Sur un vrai projet client : l’admin peut tout faire, un commercial ne fait que créer / consulter, un autre profil ne voit qu’une partie des données…
Sur Laravel, ça se gère avec les policies (pour un modèle / un CRUD). Nova les prend en compte par défaut — encore une fois, sans réinventer la roue.
Référence : Authorization — documentation Laravel Nova.
Les policies Laravel, reprises par Nova
Une policy classique (CustomerPolicy, etc.) expose les méthodes habituelles :
| Méthode | Rôle |
|---|---|
viewAny |
Peut-on accéder à l’index (la liste) ? |
view |
Peut-on voir cet enregistrement ? |
create |
Peut-on créer ? |
update |
Peut-on modifier ? |
delete |
Peut-on supprimer ? |
Nova lit ces méthodes automatiquement. Exemple : viewAny retourne false → message du type « vous n’avez pas le droit » sur la liste des clients.
Toutes les méthodes ont une valeur par défaut. Si vous créez une policy, déclarez explicitement ce que vous autorisez ou refusez — ne laissez pas de zones grises.
Conflit app métier / Nova : deux solutions
Sur une grosse app, la même policy peut servir à l’API, au front, et à Nova. Les règles ne sont pas toujours identiques → risque de friction.
1. Nova::whenServing() dans la policy
Dans une méthode, branchez selon le contexte :
public function view(User $user, Customer $customer): bool
{
return Nova::whenServing(
fn () => /* règles côté Nova */,
fn () => /* règles hors Nova (API, app métier…) */
);
}
Pratique pour une policy unique et des écarts ponctuels.
2. Policies dédiées Nova
Si la séparation revient souvent : créez des policies spécifiques Nova (ex. dans app/Nova/Policies/). Elles reçoivent la ressource Nova, pas seulement le modèle Eloquent.
Comportement Nova :
- policy Nova présente pour
Order→ elle est utilisée dans Nova ; - sinon → policy Laravel classique du modèle.
Même idée, même clarté : une policy « métier », une policy « admin ».
Masquer un bouton ≠ filtrer les données
Cas fréquent : « je veux voir uniquement les clients au statut client (pas les prospects) ».
Si vous mettez view() à false pour les prospects :
- le bouton « voir » disparaît ;
- mais la ligne peut encore apparaître dans l’index.
Pour filtrer réellement la liste, allez sur la ressource Nova (app/Nova/Customer.php) et utilisez indexQuery() :
public static function indexQuery(NovaRequest $request, $query)
{
return $query->where('status', CustomerStatus::Client);
}
Sans filtre : vous retournez $query tel quel (tous les enregistrements autorisés).
Avec filtre : seuls les clients au bon statut restent visibles après refresh.
Le même principe existe pour le détail via detailQuery() (et d’autres hooks de requête selon le besoin).
Gates vs policies
Laravel propose gates et policies. Pour des accès liés à un modèle et un CRUD, on parle surtout de policies. Nova, basé sur Laravel, s’appuie sur ce mécanisme — c’est cohérent et documenté.
En résumé :
- Générer / écrire la policy (
php artisan make:policy …) ; - Remplir
true/false(ou conditions métier) ; - Laisser Nova appliquer le tout ;
- Affiner les listes avec
indexQuery()si besoin.
Pas d’overlay UI custom : encore un gain de temps pour vos back-offices clients.
Vidéo : policies en pratique
FAQ rapide (SEO & technique)
Nova utilise-t-il les policies Laravel ?
Oui — par défaut, sans configuration supplémentaire.
À quoi sert viewAny ?
Autoriser ou refuser l’accès à l’index de la ressource.
Comment séparer règles app et règles Nova ?
Nova::whenServing() dans la policy, ou policies dédiées Nova.
Comment n’afficher que certains enregistrements ?
indexQuery() (et éventuellement detailQuery()) sur la ressource — pas seulement view().
Gates ou policies pour un CRUD ?
Pour un modèle / CRUD, préférez les policies.
Conclusion
Avec les policies, le back-office Nova est non seulement rapide à monter, mais aussi sécurisé : droits CRUD, index, détail, et filtrage des données visibles.
Vous avez désormais le socle d’un CRUD classique : ressources, champs, filtres, stats, actions, recherche, accès.
Suite de la série : Laravel Nova : custom fields et tools (aller au-delà du CRUD).
Pour approfondir Laravel (policies, gates, auth…) : ma formation Laravel sur Udemy (lien et code promo dans la description de la vidéo). Abonnez-vous à la chaîne YouTube pour la suite.