1. Introducción a las reglas de seguridad
Las reglas de seguridad de Firebase son la forma en que protegemos nuestros datos en Firestore y Realtime Database. Actúan como un guardián que decide quién puede leer o escribir qué datos.
¿Por qué son importantes?
Sin reglas de seguridad adecuadas, cualquier persona podrÃa acceder o modificar tus datos, lo que representa un grave riesgo para tu aplicación.
Conceptos clave:
- Reglas como código: Se escriben en un lenguaje especÃfico similar a JSON o JavaScript.
- Se ejecutan en el servidor: No pueden ser evitadas desde el cliente.
- Jerárquicas: Las reglas se aplican en cascada desde rutas padre a rutas hijas.
Advertencia: Las reglas por defecto permiten acceso público a todos tus datos. ¡Nunca dejes tu base de datos en producción con estas reglas!
2. Reglas básicas de lectura y escritura
Las operaciones básicas que podemos controlar son read
(lectura) y write
(escritura).
Estructura básica para Firestore:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if false; } } }
Ejemplos de reglas básicas:
Denegar todo el acceso:
allow read, write: if false;
Permitir todo el acceso (no recomendado para producción):
allow read, write: if true;
Permitir solo lectura:
allow read: if true; allow write: if false;
Ejercicio: Crea una regla que permita escritura pero no lectura. ¿En qué casos podrÃa ser útil esta configuración?
Reglas para rutas especÃficas:
Podemos aplicar reglas diferentes a diferentes colecciones o documentos:
match /publicaciones/{postId} { allow read: if true; allow create: if request.auth != null; allow update, delete: if request.auth != null && request.auth.uid == resource.data.autorId; }
3. Reglas basadas en la autenticación
Una de las formas más comunes de proteger datos es vinculándolos a la autenticación de usuarios.
Verificar si el usuario está autenticado:
allow read, write: if request.auth != null;
Acceder a propiedades del usuario:
allow write: if request.auth.token.email_verified == true;
Comparar con el UID del usuario:
// Para datos donde el documento tiene un campo 'userId' allow read, write: if request.auth != null && request.auth.uid == resource.data.userId;
Roles personalizados:
Podemos implementar un sistema de roles usando claims personalizados:
allow write: if request.auth.token.admin == true;
Ejemplo completo: Reglas para un sistema de blog donde los usuarios solo pueden editar sus propias publicaciones y los administradores pueden editar cualquier cosa.
service cloud.firestore { match /databases/{database}/documents { match /publicaciones/{postId} { allow read: if true; allow create: if request.auth != null; allow update, delete: if request.auth != null && (request.auth.uid == resource.data.autorId || request.auth.token.admin == true); } } }
4. Cómo probar tus reglas
Probar las reglas es fundamental para garantizar la seguridad de tu aplicación.
Simulador en Firebase Console:
- Ve a la pestaña "Reglas" en Firebase Console.
- Haz clic en "Simulador".
- Configura el tipo de operación (lectura, escritura).
- Especifica la ruta y los datos de autenticación.
- Ejecuta la simulación y verifica el resultado.
Pruebas unitarias con el SDK de Firebase:
Puedes escribir pruebas automatizadas para tus reglas:
const firebase = require('@firebase/testing'); beforeEach(async () => { const db = await firebase.initializeTestApp({ projectId: "my-test-project", auth: { uid: "alice", email: "alice@example.com" } }).firestore(); // Configura datos de prueba await db.collection("publicaciones").doc("post1").set({ autorId: "alice", titulo: "Mi primera publicación" }); }); it("puede leer sus propias publicaciones", async () => { const db = firebase.getFirestore("alice"); const doc = db.collection("publicaciones").doc("post1"); await firebase.assertSucceeds(doc.get()); });
Mejores prácticas para probar reglas:
- Prueba casos de éxito y de fracaso.
- Prueba con diferentes roles de usuario.
- Prueba operaciones en lotes y transacciones.
- Automatiza las pruebas en tu pipeline de CI/CD.
Ejercicio final: Crea un conjunto de reglas para una aplicación de tareas donde:
- Cualquiera puede leer las tareas marcadas como públicas
- Los usuarios autenticados pueden crear tareas
- Solo el creador puede actualizar o eliminar una tarea
- Los administradores pueden hacer cualquier operación
Luego escribe pruebas para verificar cada uno de estos casos.
Recursos adicionales
Esta entrada forma parte del curso completo de Firebase
0 Comentarios