Configura reglas de seguridad de Cloud Firestore

Con Cloud Firestore y las reglas de seguridad de Cloud Firestore para bibliotecas cliente de Android, iOS y Web, puedes enfocarte en crear una gran experiencia para el usuario, sin necesidad de administrar la infraestructura o escribir código para la autorización y autenticación en el servidor. Autentica a los usuarios a través de Firebase Authentication y configura reglas para determinar quién tiene acceso a los datos almacenados en Cloud Firestore.

Configura y personaliza las reglas de seguridad de Cloud Firestore en Firebase console.

Configura reglas de seguridad de Cloud Firestore

Puedes crear y, luego, implementar tu primer conjunto de reglas de seguridad de Cloud Firestore con Firebase console o Firebase CLI.

Usa Firebase console

Para configurar e implementar tu primer conjunto de reglas, abre la pestaña Reglas en la sección Cloud Firestore de Firebase console.

Cloud Firestore llena una regla predeterminada que deniega el acceso de read y write a todos los datos:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Puedes cambiar la regla para permitir el acceso de todos los usuarios o de un conjunto específico de usuarios durante la etapa de programación o creación del prototipo. Te recomendamos que configures Firebase Authentication y que evalúes las reglas para garantizar que proporcionan el nivel de seguridad máximo que necesita tu aplicación antes de su lanzamiento.

Usa Firebase CLI

También puedes implementar reglas con Firebase CLI. Para comenzar, ejecuta firebase init firestore en el directorio de tu proyecto. Durante el inicio, Firebase CLI genera un archivo de reglas predeterminadas (.rules), con las reglas descritas antes. Edita tus reglas y ejecuta firebase deploy para implementarlas. Si solo deseas implementar las reglas, agrega la marca --only firestore:rules.

Si usas Firebase CLI, ten en cuenta que todas las modificaciones que hagas en las reglas en Firebase console no se reflejan en tu máquina local. Si haces modificaciones en Firebase console, asegúrate de actualizar tu archivo de reglas local.

Edita las reglas de seguridad de Cloud Firestore

Antes de personalizar tus reglas, revisemos cómo funcionan. Las reglas coinciden (match) con las rutas de acceso que representan un documento o una colección en Cloud Firestore. Las reglas pueden coincidir (match) con una o más rutas (por ejemplo, una regla puede coincidir con todos los documentos de una colección) y más de una regla puede coincidir (match) con el nombre del documento en una solicitud (request) determinada.

Si varias reglas coinciden con un documento determinado, Cloud Firestore permite que una operación se ejecute de forma correcta si alguna de estas reglas que coinciden lo permite. Por ejemplo, si una regla permite el acceso de escritura en un documento para un usuario, pero otras reglas solo permiten el acceso de lectura para ese usuario, Cloud Firestore permite al usuario escribir en ese documento de todas maneras.

El tipo básico de regla es allow, que permite operaciones read y write, si se cumple una condición que puede especificarse opcionalmente.

Aplica reglas a varios documentos o colecciones con comodines. Los comodines representan el ID de documento o de colección en la ruta match como una cadena entre corchetes. Agrega =** al final de la cadena comodín para aplicar el comodín a todos los documentos y subcolecciones de la ruta. Obtén más información sobre el uso de comodines en las reglas.

service cloud.firestore {
  match /databases/{database}/documents {
    // Rules match specific paths, matching a particular document within a collection
    match /myCollection/myDocument {
      allow read, write: if <condition>;
    }

    // Rules can also specify a wildcard, matching any document within a collection
    match /myCollection/{anyDocument} {
      allow write: if <other_condition>;
    }
  
  }
}

El contexto de evaluación de reglas también se expone a través de los objetos request y resource. El objeto request tiene información sobre la solicitud, como el usuario autenticado (request.auth) y la hora en que se realizó la solicitud (request.time). El objeto resource es un documento de Cloud Firestore.

service cloud.firestore {
  match /databases/{database}/documents {
    // Rules can specify conditions that consider the request context
    // Such as user authentication or time of the request
    match /myCollection/myDocument {
      allow read: if request.auth != null;
    }

    // Rules can also consider fields of the resource being read or written
    match /myCollection/myDocument {
      allow read: if resource.data.field == value;
    }

    // Rules can also consider the contents of other documents stored
    // This can be used to enforce schema and referential integrity
    match /myCollection/myDocument {
      allow read: get(/myCollection/otherDocument).data.field == value;
    }

  }
}

Considera el ejemplo siguiente para una app de chat simple. La primera regla restringe el acceso de un usuario específico a los datos específicos de ese usuario. La segunda regla permite el acceso a todos los mensajes en una sala de chat para todos los usuarios.

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read, write: if request.auth.uid == userId;
    }
    match /rooms/{roomId} {
      match /messages/{messageId} {
        allow read, write: if request.auth != null;
      }
    }
  }
}

Ejemplos de reglas

Aquí hay algunos ejemplos de otras reglas comunes con diferente control de acceso.

Pública

// Anyone can read or write to the database, even non-users of your app.
service cloud.firestore {
  match /databases/{database}/documents {
    // Match all documents, recursively, with a wildcard and the "=**" recursive modifier
    match /{document=**} {
      allow read, write;
    }
  }
}

Usuario

// Grants a user access to a document matching their Auth user Id
service cloud.firestore {
  match /databases/{database}/documents {
    // Collection named "users", document named after the userId
    match /users/{userId} {
      allow read, write: if request.auth.uid == userId;
    }
  }
}

Privada

// Access to documents through the Cloud Firestore mobile/web
// client libraries is completely disallowed. Documents may still be
// accessible through the Cloud Firestore server client libraries;
// the Cloud Firestore REST and RPC APIs; and the Cloud Datastore
// client libraries and APIs.
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Próximos pasos

Obtén más información sobre cómo personalizar las reglas para que se ajusten a tus necesidades.

Enviar comentarios sobre…

¿Necesitas ayuda? Visita nuestra página de asistencia.