rules_version = '2'; // ============================================================================ // RÈGLES FIRESTORE SÉCURISÉES - VERSION PRODUCTION // ============================================================================ // Date de création : 14 janvier 2026 // Objectif : Bloquer tous les accès directs à Firestore depuis les clients // Seules les Cloud Functions (côté serveur) peuvent lire/écrire les données // ============================================================================ service cloud.firestore { match /databases/{database}/documents { // ======================================================================== // RÈGLE GLOBALE PAR DÉFAUT : TOUT BLOQUER // ======================================================================== // Cette règle empêche tout accès direct depuis les clients (web/mobile) // Les Cloud Functions ont un accès admin et ne sont pas affectées match /{document=**} { // ❌ REFUSER TOUS LES ACCÈS directs depuis les clients allow read, write: if false; } // ======================================================================== // EXCEPTIONS OPTIONNELLES pour les listeners temps réel // ======================================================================== // Si vous avez besoin de listeners en temps réel pour certaines collections, // décommentez les règles ci-dessous. // // ⚠️ IMPORTANT : Ces règles permettent UNIQUEMENT la LECTURE. // Toutes les ÉCRITURES doivent passer par les Cloud Functions. // ======================================================================== /* // Événements : Lecture seule pour utilisateurs authentifiés match /events/{eventId} { allow read: if request.auth != null; allow write: if false; // ❌ Écriture interdite } // Équipements : Lecture seule pour utilisateurs authentifiés match /equipments/{equipmentId} { allow read: if request.auth != null; allow write: if false; // ❌ Écriture interdite } // Conteneurs : Lecture seule pour utilisateurs authentifiés match /containers/{containerId} { allow read: if request.auth != null; allow write: if false; // ❌ Écriture interdite } // Maintenances : Lecture seule pour utilisateurs authentifiés match /maintenances/{maintenanceId} { allow read: if request.auth != null; allow write: if false; // ❌ Écriture interdite } */ // Alertes : Lecture et création pour utilisateurs authentifiés // Le trigger backend (onAlertCreated) s'occupe d'assigner les bonnes personnes match /alerts/{alertId} { allow read: if request.auth != null; allow create: if request.auth != null && request.resource.data.createdBy == request.auth.uid; // Vérifier que l'utilisateur crée l'alerte en son nom allow update: if request.auth != null && ( // L'utilisateur peut marquer comme lue uniquement s'il est assigné (request.auth.uid in resource.data.assignedTo && request.resource.data.diff(resource.data).affectedKeys().hasOnly(['isRead', 'readAt'])) // Ou le backend peut tout modifier (processed, assignedTo, etc.) || !('createdBy' in resource.data) // Le trigger backend n'a pas de createdBy ); allow delete: if request.auth != null && request.auth.uid in resource.data.assignedTo; } /* // Utilisateurs : Lecture de son propre profil uniquement match /users/{userId} { allow read: if request.auth != null && request.auth.uid == userId; allow write: if false; // ❌ Écriture interdite } // Types d'événements : Lecture seule match /eventTypes/{typeId} { allow read: if request.auth != null; allow write: if false; // ❌ Écriture interdite } // Options : Lecture seule match /options/{optionId} { allow read: if request.auth != null; allow write: if false; // ❌ Écriture interdite } // Clients : Lecture seule match /customers/{customerId} { allow read: if request.auth != null; allow write: if false; // ❌ Écriture interdite } */ // ======================================================================== // RÈGLES AVANCÉES avec vérification des permissions (OPTIONNEL) // ======================================================================== // Décommentez ces règles si vous voulez des permissions basées sur les rôles // pour la lecture en temps réel // // ⚠️ ATTENTION : Ces règles nécessitent une lecture supplémentaire dans // la collection users, ce qui peut impacter les performances et les coûts. // ======================================================================== /* // Fonction helper : Récupérer les permissions de l'utilisateur function getUserPermissions() { return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.permissions; } // Fonction helper : Vérifier si l'utilisateur a une permission function hasPermission(permission) { return request.auth != null && permission in getUserPermissions(); } // Équipements : Lecture uniquement si permission view_equipment match /equipments/{equipmentId} { allow read: if hasPermission('view_equipment') || hasPermission('manage_equipment'); allow write: if false; // ❌ Écriture interdite } // Événements : Lecture selon permissions match /events/{eventId} { allow read: if hasPermission('view_events') || hasPermission('edit_event'); allow write: if false; // ❌ Écriture interdite } // Conteneurs : Lecture uniquement si permission view_equipment match /containers/{containerId} { allow read: if hasPermission('view_equipment') || hasPermission('manage_equipment'); allow write: if false; // ❌ Écriture interdite } // Maintenances : Lecture uniquement si permission view_equipment match /maintenances/{maintenanceId} { allow read: if hasPermission('view_equipment') || hasPermission('manage_equipment'); allow write: if false; // ❌ Écriture interdite } */ } } // ============================================================================ // NOTES DE SÉCURITÉ // ============================================================================ // // 1. RÈGLE PAR DÉFAUT (allow read, write: if false) // - Bloque TOUS les accès directs depuis les clients // - Les Cloud Functions ne sont PAS affectées (elles ont un accès admin) // - C'est la configuration la PLUS SÉCURISÉE // // 2. EXCEPTIONS DE LECTURE (commentées par défaut) // - Permettent les listeners en temps réel pour certaines collections // - UNIQUEMENT la LECTURE est autorisée // - Les ÉCRITURES restent bloquées (doivent passer par Cloud Functions) // // 3. RÈGLES BASÉES SUR LES RÔLES (commentées par défaut) // - Permettent un contrôle plus fin basé sur les permissions utilisateur // - ⚠️ Impact sur les performances (lecture supplémentaire de la collection users) // - À utiliser uniquement si nécessaire // // 4. TESTS APRÈS DÉPLOIEMENT // - Vérifier que les Cloud Functions fonctionnent toujours // - Tester qu'un accès direct depuis la console échoue // - Surveiller les logs : firebase functions:log // // 5. ROLLBACK EN CAS DE PROBLÈME // - Remplacer temporairement par : // match /{document=**} { // allow read, write: if request.auth != null; // } // - Déployer rapidement : firebase deploy --only firestore:rules // // ============================================================================