Authentification
XetaSuite utilise Laravel Sanctum en mode stateful (cookies) pour l’authentification SPA. Aucun token API n’est stocké côté client.
Flow d’authentification
Section intitulée « Flow d’authentification »sequenceDiagram participant SPA as React SPA participant Laravel as Laravel Backend
SPA->>Laravel: GET /sanctum/csrf-cookie Laravel-->>SPA: Set XSRF-TOKEN cookie SPA->>Laravel: POST /api/v1/auth/login (+ credentials) Laravel-->>SPA: Set session cookie SPA->>Laravel: GET /api/v1/user (with cookies) Laravel-->>SPA: User data + permissionsConfiguration Backend
Section intitulée « Configuration Backend »Sanctum (config/sanctum.php)
Section intitulée « Sanctum (config/sanctum.php) »'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost,localhost:5173,127.0.0.1,xetasuite.test')),CORS (config/cors.php)
Section intitulée « CORS (config/cors.php) »'paths' => ['api/*', 'sanctum/csrf-cookie'],'allowed_origins' => [env('FRONTEND_URL', 'http://localhost:5173')],'supports_credentials' => true,Configuration Frontend
Section intitulée « Configuration Frontend »Client HTTP (Axios)
Section intitulée « Client HTTP (Axios) »const httpClient = axios.create({ baseURL: import.meta.env.VITE_API_URL || '', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-Requested-With': 'XMLHttpRequest', }, withCredentials: true, // ⚠️ Obligatoire pour Sanctum withXSRFToken: true, // Auto-inclut le header X-XSRF-TOKEN});Implémentation Login
Section intitulée « Implémentation Login »-
Obtenir le cookie CSRF
await axios.get('/sanctum/csrf-cookie'); -
Envoyer les credentials
await httpClient.post('/api/v1/auth/login', {email: 'admin@xetasuite.test',password: 'password',remember: true}); -
Récupérer l’utilisateur
const { data } = await httpClient.get('/api/v1/user');// data contient: user, roles[], permissions[]
Vérification des permissions
Section intitulée « Vérification des permissions »// Dans les composants Reactconst { hasPermission, hasRole, hasAnyPermission, hasAnyRole, isOnHeadquarters} = useAuth();
// Vérifier une permissionif (hasPermission('company.create')) { // Afficher le bouton de création}
// Vérifier un rôleif (hasRole('admin')) { // Afficher le panel admin}
// Vérifier plusieurs permissionsif (hasAnyPermission(['company.update', 'company.delete'])) { // Afficher le menu}
// Vérifier plusieurs rôlesif (hasRole(['admin', 'manager'])) { // Afficher le bouton d'édition utilisateur}
// Vérifier si l'utilisateur est sur le site siègeif (isOnHeadquarters()) { // L'utilisateur est sur le site siège}Prochaines étapes
Section intitulée « Prochaines étapes »- Rôles & Permissions - Système de permissions
- Multi-Sites - Permissions par site