Files
EM2_ERP/em2rp/firestore.rules
T

196 lines
7.9 KiB
Plaintext

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;
}
// Autoriser l'accès aux collections de configuration de l'application
match /depots/{document=**} {
allow read, write: if request.auth != null;
}
match /vehicles/{document=**} {
allow read, write: if request.auth != null;
}
match /app_config/{document=**} {
allow read, write: if request.auth != null;
}
// ========================================================================
// 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
//
// ============================================================================