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.

Reglas de seguridad de la base de datos de Firestore: Problema con la restricción de colección basada en un array de otra colección.

Tenemos problemas con nuestra configuración de reglas de seguridad.

Nuestro código se ve así:

service cloud.firestore {
match /databases/{database}/documents {

  function sameCompany(){
    return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.companyId == resource.data.companyId
    && request.auth.uid in get(/databases/$(database)/documents/companies/$(resource.data.companyId)).data.users;
  }

  match /orders/{orderId} {
      allow read: if request.auth != null && sameCompany();
}}

Las colecciones tienen la siguiente estructura:

orders/{orderId}

users/{userId}

companies/{companyId}

Cada documento en “orders” tiene un companyId. Cada documento en “users” tiene un companyId. Cada documento en “companies” tiene un array que contiene los userIds que pertenecen a la compañía.

Solo los usuarios que tienen el mismo companyId que el pedido y cuyo userId está en el array de la compañía deberían poder leer los pedidos. Esto es para tener una doble seguridad y evitar que los usuarios cambien su companyId para leer pedidos de otra compañía.

La parte anterior al && funciona correctamente. Si coloco manualmente un array después de “request.auth.uid in ” que contiene el userId que está haciendo la consulta, también funciona correctamente. Pero de alguna manera no funciona de esta manera y no puedo encontrar el problema aquí.

¿Alguien puede ayudar? ¡Gracias por su tiempo!

Edit1:
Gracias por sus respuestas hasta ahora.

Entonces, la consulta se ve así:

query(
  collection(db, "orders"),
  where("companyId", "==", user.companyId)
)

Almacenamos en el almacenamiento local el usuario con el companyId. Sin la segunda parte después del &&, los datos se recuperan correctamente, pero con ella no se muestra nada. Queremos verificar doblemente si el usuario tiene el mismo companyId y si está en el array de usuarios de la compañía en caso de que alguien intente adivinar el companyId de otra compañía y pueda acceder a los datos de alguna manera. De esta manera, necesitarías conocer tanto el companyId como el userId.

Los datos podrían verse simplemente así:

Documento de usuarios con uId1:
{companyId: cId1, …}

Documento de pedidos con dId1:
{companyId: cId1, …}

Documentos de compañías con cId1:
{users: [uId1], …}

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema con la configuración de las reglas de seguridad está en la segunda parte de la función “sameCompany”. La lógica parece correcta, pero puede haber un error al recuperar los datos o en la estructura de los datos mismos.

    Un posible problema podría ser con el array “users” en la colección “companies”. Asegúrate de que el array contenga los ID de usuario reales (por ejemplo, “uId1”) y no solo las referencias o rutas de los documentos (por ejemplo, “users/uId1”).

    También puedes probar ejecutar algunas pruebas para ver si la función “sameCompany” está devolviendo los resultados correctos. Por ejemplo, puedes intentar recuperar los datos del usuario y de la empresa utilizando la función get() y comprobar si la función “sameCompany” devuelve true o false en función de los datos.

    Por último, también puedes revisar la consola de Firestore en busca de errores o advertencias relacionadas con las reglas de seguridad. Esto te puede dar más información sobre el problema y ayudarte a resolverlo más rápido.

    ¡Espero que esto te ayude!

Comments are closed.