获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

Comprender las reglas de seguridad de la base de datos en tiempo real de Firebase

Las reglas de seguridad de Firebase Realtime Database determinan quién tiene acceso de lectura y escritura a su base de datos, cómo se estructuran sus datos y qué índices existen. Estas reglas viven en los servidores de Firebase y se aplican automáticamente en todo momento. Cada solicitud de lectura y escritura solo se completará si sus reglas lo permiten. De forma predeterminada, sus reglas no permiten que nadie acceda a su base de datos. Esto es para proteger su base de datos de abusos hasta que tenga tiempo de personalizar sus reglas o configurar la autenticación.

Las reglas de seguridad de la base de datos en tiempo real tienen una sintaxis similar a JavaScript y vienen en cuatro tipos:

Tipos de reglas
.leer Describe si los usuarios pueden leer los datos y cuándo.
.escribe Describe si se permite escribir datos y cuándo.
.validar Define el aspecto que tendrá un valor con el formato correcto, si tiene atributos secundarios y el tipo de datos.
.indexOn Especifica un elemento secundario para indexar para admitir pedidos y consultas.

Descripción general de la seguridad de la base de datos en tiempo real

Firebase Realtime Database proporciona un conjunto completo de herramientas para administrar la seguridad de su aplicación. Estas herramientas facilitan la autenticación de sus usuarios, el cumplimiento de los permisos de los usuarios y la validación de las entradas.

Las aplicaciones basadas en Firebase ejecutan más código del lado del cliente que aquellas con muchas otras pilas de tecnología. Por lo tanto, la forma en que abordamos la seguridad puede ser un poco diferente a la que está acostumbrado.

Autenticación

Un primer paso común para asegurar su aplicación es identificar a sus usuarios. Este proceso se llama autenticación . Puede usar Firebase Authentication para que los usuarios inicien sesión en su aplicación. Firebase Authentication incluye soporte directo para métodos de autenticación comunes como Google y Facebook, así como inicio de sesión con correo electrónico y contraseña, inicio de sesión anónimo y más.

La identidad del usuario es un concepto de seguridad importante. Diferentes usuarios tienen datos diferentes y, a veces, tienen capacidades diferentes. Por ejemplo, en una aplicación de chat, cada mensaje está asociado con el usuario que lo creó. Los usuarios también pueden eliminar sus propios mensajes, pero no los mensajes publicados por otros usuarios.

Autorización

Identificar a su usuario es solo una parte de la seguridad. Una vez que sepa quiénes son, necesita una forma de controlar su acceso a los datos en su base de datos. Las reglas de seguridad de la base de datos en tiempo real le permiten controlar el acceso de cada usuario. Por ejemplo, aquí hay un conjunto de reglas de seguridad que permite que cualquier persona lea la ruta /foo/ , pero nadie escriba en ella:

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

Las reglas .read y .write en cascada, por lo que este conjunto de reglas otorga acceso de lectura a cualquier dato en la ruta /foo/ , así como a cualquier ruta más profunda, como /foo/bar/baz . Tenga en cuenta que las reglas .read y .write menos profundas en la base de datos anulan las reglas más profundas, por lo que el acceso de lectura a /foo/bar/baz aún se otorgaría en este ejemplo, incluso si una regla en la ruta /foo/bar/baz se evaluara como falsa.

Las reglas de seguridad de la base de datos en tiempo real incluyen variables y funciones integradas que le permiten hacer referencia a otras rutas, marcas de tiempo del lado del servidor, información de autenticación y más. Este es un ejemplo de una regla que otorga acceso de escritura para usuarios autenticados a /users/<uid>/ , donde <uid> es el ID del usuario obtenido a través de Firebase Authentication.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

Validación de datos

Firebase Realtime Database no tiene esquemas. Esto facilita cambiar las cosas a medida que desarrolla, pero una vez que su aplicación está lista para distribuirse, es importante que los datos se mantengan consistentes. El lenguaje de reglas incluye una regla .validate que le permite aplicar la lógica de validación usando las mismas expresiones que se usan para las reglas .read y .write . La única diferencia es que las reglas de validación no se conectan en cascada , por lo que todas las reglas de validación relevantes deben evaluarse como verdaderas para que se permita la escritura.

Estas reglas imponen que los datos escritos en /foo/ deben ser una cadena de menos de 100 caracteres:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

Las reglas de validación tienen acceso a todas las mismas funciones y variables integradas que las reglas .read y .write . Puede usarlos para crear reglas de validación que tengan en cuenta los datos en otras partes de su base de datos, la identidad de su usuario, la hora del servidor y mucho más.

Definición de índices de base de datos

Firebase Realtime Database permite ordenar y consultar datos. Para tamaños de datos pequeños, la base de datos admite consultas ad hoc, por lo que generalmente no se requieren índices durante el desarrollo. Sin embargo, antes de lanzar su aplicación, es importante especificar índices para cualquier consulta que tenga para asegurarse de que continúen funcionando a medida que crece su aplicación.

Los índices se especifican mediante la regla .indexOn . Aquí hay una declaración de índice de ejemplo que indexaría los campos de altura y longitud para una lista de dinosaurios:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

Próximos pasos