Drag

Laravel Nova : sécurité et policies (accès CRUD)

Laravel Nova : sécurité et policies (partie 7)

Écrit par : Thibault Chazottes

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 :

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é :

  1. Générer / écrire la policy (php artisan make:policy …) ;
  2. Remplir true / false (ou conditions métier) ;
  3. Laisser Nova appliquer le tout ;
  4. 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.