es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo establecer reglas en Firebase Firestore y Realtime? Para establecer reglas en Firebase Firestore, siga los siguientes pasos: 1. Abra Firebase Console y seleccione su proyecto. 2. Vaya a la pestaña “Firestore Database” en la sección “Desarrollo”. 3. En la parte superior izquierda, haga clic en “Reglas”. 4. En el editor de reglas, puede definir las reglas para leer y escribir en su base de datos Firestore. 5. Puede utilizar el lenguaje de reglas de seguridad Firestore para especificar las condiciones que deben cumplir las solicitudes de lectura y escritura. Para establecer reglas en Firebase Realtime, siga los siguientes pasos: 1. Abra Firebase Console y seleccione su proyecto. 2. Vaya a la pestaña “Realtime Database” en la sección “Desarrollo”. 3. En la parte superior izquierda, haga clic en “Reglas”. 4. En el editor de reglas, puede definir las reglas para leer y escribir en su base de datos en tiempo real. 5. Utilice el lenguaje de reglas de seguridad Firebase Realtime para especificar las condiciones que deben cumplir las solicitudes de lectura y escritura. Recuerde siempre considerar la seguridad en la configuración de las reglas para proteger sus datos y asegurarse de que solo los usuarios autorizados tengan acceso a su base de datos.

En Firebase Firestore:
Tengo tres colecciones diferentes: 1: “users”, 2: “ContactUs”, 3: “Reports”.
En “users”, el documento se crea por uid y luego tiene un campo dentro con el nombre de “uid”.
En “ContactUs” y “Reports”, el documento se genera aleatoriamente y es diferente cada vez.

He intentado las siguientes reglas, pero no estoy seguro/a de ellas, por favor, ayúdeme a corregirlas. En “ContactUs” y “Reports”, ¿debería haber {userId} o algo más ya que es diferente cada vez y cómo lo voy a comparar con uid si no hay un campo de uid dentro de ellos?

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow write, update, delete: if
        request.auth.uid == userId;
      allow read: if request.auth.uid != null;
    }
    match /ContactUs/{userId} {  
      allow write, update, delete: if
        request.auth.uid == userId;
      allow read: if request.auth.uid != null;
    }
    match /Reports/{userId} {
      allow write, update, delete: if
        request.auth.uid == userId;
      allow read: if request.auth.uid != null;
    }
  }
}

En base de datos en tiempo real: He adjuntado una foto de referencia que muestra los detalles del hijo creado cuando los usuarios comienzan un nuevo chat. Aquí está la foto.

He intentado las siguientes reglas en tiempo real, pero dice: “Tus reglas de seguridad no son seguras. Cualquier usuario autenticado puede robar, modificar o eliminar datos de tu base de datos”.

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

Por favor, ayúdeme a configurarlas correctamente. Gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    En Firebase Firestore:
    Para las colecciones de ContactUs y Reports, en lugar de usar {userId} en las reglas de seguridad, puedes usar un símbolo de comodín (*) para indicar que las reglas se aplicarán a cualquier documento que coincida con el nombre de la colección. Luego, dentro de las reglas, puedes acceder al uid del usuario autenticado a través de “request.auth.uid”.

    Aquí tienes un ejemplo actualizado de reglas de seguridad:

    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
        // Permitir solo a usuarios autenticados leer y escribir en la colección de usuarios
        match /users/{userId} {
          allow write, update, delete: if request.auth.uid == userId;
          allow read: if request.auth.uid != null;
        }
    
        // Permitir solo a usuarios autenticados leer y escribir en la colección de ContactUs
        match /ContactUs/{document=**} {
          allow write, update, delete: if request.auth.uid != null;
          allow read: if request.auth.uid != null;
        }
    
        // Permitir solo a usuarios autenticados leer y escribir en la colección de Reports
        match /Reports/{document=**} {
          allow write, update, delete: if request.auth.uid != null;
          allow read: if request.auth.uid != null;
        }
      }
    }
    

    En Firebase Realtime Database:
    Las reglas de seguridad que has proporcionado en tu pregunta no imponen ninguna restricción sobre quién puede leer, escribir o modificar los datos. Básicamente significa que cualquier usuario autenticado puede leer, escribir, modificar y eliminar datos de tu base de datos. Esto puede ser un problema de seguridad importante.

    Aquí tienes un ejemplo de un conjunto de reglas más seguro para tu caso de uso:

    {
      "rules": {
        "users": {
          "$userId": {
            ".read": "auth.uid === $userId",
            ".write": "auth.uid === $userId"
          }
        },
        "chat": {
          "$userId": {
            ".write": "auth.uid === $userId",
            ".read": "auth.uid === $userId",
            "$chatId": {
              ".validate": "newData.hasChildren(['timestamp', 'message'])",
              "timestamp": {
                // Asegurar que el mensaje de chat no sea más antiguo de 5 minutos
                ".validate": "newData.val() <= now + 300000"
              },
              "message": {
                // Asegurar que el mensaje no esté vacío y no sea demasiado largo
                ".validate": "newData.isString() && newData.val().length > 0 && newData.val().length < 500"
              }
            }
          }
        }
      }
    }
    

    Con estas reglas, solo los usuarios autenticados pueden leer o escribir en las secciones “users” y “chat” de tu base de datos. La sección de chat también incluye reglas de validación adicionales para los nuevos mensajes que se agregan, como asegurarse de que el mensaje no esté vacío y no sea demasiado largo, y que el timestamp del mensaje no sea más antiguo de 5 minutos.

Comments are closed.