Image de couverture : Stack Middleware Multi-Tenant : les 11 briques qui sécurisent un SaaS Laravel en production
tech

Stack Middleware Multi-Tenant : les 11 briques qui sécurisent un SaaS Laravel en production

21 April 2026
5 min de lecture
3 vues
Sébastien Muler

Stack Middleware Multi-Tenant : les 11 briques qui sécurisent un SaaS Laravel en production

Dans un SaaS multi-tenant, chaque requête HTTP doit répondre à une série de questions critiques avant même que votre contrôleur ne s'exécute : dans quel contexte entreprise sommes-nous ? La session est-elle valide ? L'utilisateur est-il banni ? L'abonnement a-t-il expiré ? Quelle langue afficher ?

Dmitry Isaenko a publié un retour d'expérience détaillé sur l'architecture de Kohana.io, un CRM/ERP en production construit avec Laravel. Résultat : 11 middlewares personnalisés et 6 traits qui forment une stack robuste et réutilisable, aujourd'hui extraite dans le projet open-source LaraFoundry. Cet article analyse cette stack sous l'angle de l'impact UX et business — des enseignements directement applicables à un contexte PHP/Symfony.


🏗️ La stack complète et l'ordre d'exécution

L'ordre des middlewares n'est pas anodin : c'est une chaîne de responsabilités où chaque maillon dépend du précédent. Voici la séquence complète :

# Middleware Rôle
1 HandleInertiaRequests Partage les props avec le frontend Vue
2 SetActiveCompanyMiddleware Résout le contexte entreprise (tenant)
3 UpdateLastSessionActivity Trace l'activité et les infos appareil
4 AddLinkHeadersForPreloadedAssets HTTP/2 push pour la performance
5 StoreIntendedUrl Sauvegarde l'URL pour la redirection post-auth
6 SetLocale Détecte et applique la langue
7 EnsureEmailIsVerified Bloque les comptes non vérifiés
8 CheckPinLockMiddleware Verrouille après inactivité
9 CheckAccessMiddleware Vérifie les bans, paiement, droits
10 CheckSessionExists Valide la session en base de données
11 CheckForSessionValidity Régénère le token si nécessaire

Pourquoi cet ordre est critique : SetActiveCompanyMiddleware doit impérativement s'exécuter avant CheckAccessMiddleware. Sans le contexte tenant, les vérifications d'accès ne peuvent pas fonctionner. C'est une dépendance implicite qui, si elle est mal gérée, génère des bugs silencieux difficiles à reproduire.


⚙️ Les middlewares clés décryptés

Résolution du tenant : le pivot de toute l'architecture

SetActiveCompanyMiddleware est le middleware le plus stratégique. Il identifie à quelle entreprise appartient la requête — généralement via un subdomain, un header ou un paramètre de session — et charge le contexte correspondant. Toute la suite de la pipeline en dépend.

Dans un contexte Symfony, l'équivalent serait un EventListener sur kernel.request qui injecte le tenant dans un service partagé (ex. TenantContext). L'important est que cette résolution soit synchrone et précoce.

Gestion des sessions : deux middlewares distincts pour deux responsabilités

La stack sépare CheckSessionExists (la session existe-t-elle en BDD ?) de CheckForSessionValidity (le token est-il encore valide ?). Ce découplage suit le principe de responsabilité unique : chaque middleware fait une seule chose, ce qui facilite les tests et la maintenance.

Verrouillage par PIN et UX sécurisée

CheckPinLockMiddleware implémente un mécanisme de verrouillage automatique après inactivité — une fonctionnalité courante dans les ERP et CRM traitant des données sensibles. L'impact UX est direct : l'utilisateur voit un écran de déverrouillage familier plutôt qu'une déconnexion abrupte, ce qui réduit la friction tout en maintenant la sécurité.

Performance : HTTP/2 Push en middleware

AddLinkHeadersForPreloadedAssets injecte des headers Link: <asset>; rel=preload pour déclencher le push HTTP/2. Intégré dans la pipeline middleware, il est transparent pour les contrôleurs. C'est une optimisation élégante qui améliore les Core Web Vitals sans modifier la logique applicative.


✅ Checklist actionnable pour votre propre SaaS

Que vous travailliez en Laravel ou en Symfony, voici les questions à vous poser pour votre stack middleware multi-tenant :

  • Résolution du tenant : est-elle la première chose exécutée ? Toutes les étapes suivantes en dépendent.
  • Isolation des contextes : un tenant peut-il accidentellement accéder aux données d'un autre ? Testez-le explicitement.
  • Gestion des sessions : validez-vous la session en base de données, ou uniquement côté cookie ? La validation BDD est indispensable pour permettre la déconnexion forcée.
  • Hiérarchie des vérifications d'accès : l'ordre est-il cohérent ? (ban utilisateur → ban propriétaire → abonnement expiré → droits applicatifs)
  • Localisation : la langue est-elle résolue avant le rendu des erreurs d'accès ? Sinon, vos messages d'erreur peuvent s'afficher dans la mauvaise langue.
  • Redirection post-auth : sauvegardez-vous l'URL d'intention avant la redirection vers le login ? L'expérience utilisateur s'en trouve considérablement améliorée.
  • Performance : avez-vous mesuré le coût de chaque middleware ? Un middleware mal optimisé s'exécute sur chaque requête.

💡 Les bénéfices business concrets

Cette architecture soignée n'est pas un luxe technique — elle a des impacts directs sur l'activité :

Isolation clients garantie : une résolution de tenant robuste dès le début de la pipeline élimine les risques de fuite de données inter-tenants, un point de conformité RGPD non négociable.

Réduction du churn : le verrouillage par PIN, les redirections post-auth et la gestion fine des sessions expirations réduisent les micro-frictions quotidiennes. Sur un outil métier utilisé plusieurs heures par jour, ces détails font la différence entre un utilisateur satisfait et un ticket support.

Maintenabilité et vélocité : une stack organisée avec des responsabilités claires permet d'ajouter de nouvelles règles d'accès (ex. restriction par plage horaire, limitation géographique) sans toucher aux middlewares existants.


Conclusion

L'article de Dmitry Isaenko (source originale sur dev.to) illustre une vérité fondamentale : dans un SaaS multi-tenant, la pipeline de requête est votre première ligne de défense et d'expérience utilisateur. Chaque middleware mal ordonné ou manquant est un risque sécuritaire ou une friction UX potentielle.

Que votre stack soit Laravel ou Symfony, les principes restent identiques : résoudre le tenant tôt, séparer les responsabilités, ordonner les vérifications logiquement, et mesurer l'impact de chaque couche. Une architecture middleware solide est un investissement qui se rentabilise à chaque sprint.

Partager cet article