usuario reglas firestore auth firebase firebase-security

firestore - reglas firebase



Firebase: establece reglas de seguridad segĂșn los roles de los usuarios (1)

Me gustaría implementar reglas de seguridad de "escritura" en Firebase según los roles de los usuarios.
Mi estructura de datos es así:

+ myapp + users + john + email: "[email protected]" + roles + administrator: true + mary + email: "[email protected]" + roles + moderator: true + ... + documents + -JVmo6wZM35ZQr0K9tJu + ... + -JVr56hVTZxlAI5AgUaS + ... + ...

Quiero, por ejemplo, que solo los usuarios administradores puedan escribir documentos.
Estas son las reglas a las que he llegado:

{ "rules": { ".read": true, "$documents": { ".write": "root.child(''users'').child(auth.uid).child(''roles'').child(''administrator'').val() === true" } } }

Pero no funciona: ni siquiera los usuarios administradores pueden escribir documentos ...
¿Mi comprensión de las reglas de seguridad de Firebase es totalmente errónea?

ACTUALIZACIÓN : Justo antes de la respuesta de Jenny (créanlo o no :-), implementé exactamente la misma solución que él proporciona (por supuesto, basada en el comentario de Kato).
Sin embargo, al hacer algunas pruebas, no pude dejar que la estructura de las reglas

{ "rules": { "documents" { "$document" { ".read": "root.child(''users'').child(auth.uid).child(''roles'').child(''documents'').child(''read'').val() === true", ".write": "root.child(''users'').child(auth.uid).child(''roles'').child(''documents'').child(''write'').val() === true" } } } }

trabajo ... siempre recibo una advertencia como esta:

"FIREBASE WARNING: on() or once() for /documents failed: Error: permission_denied: Client doesn''t have permission to access the desired data. "

Así que se me ocurrió esta estructura, en cambio:

{ "rules": { "documents" { ".read": "root.child(''users'').child(auth.uid).child(''roles'').child(''documents'').child(''read'').val() === true", ".write": "root.child(''users'').child(auth.uid).child(''roles'').child(''documents'').child(''write'').val() === true" } } }

Lo que de hecho funciona, para mí: si configuro un nodo de roles / clientes / lectura como verdadero en un usuario, puede leer todos los documentos, de lo contrario no puede (y lo mismo para escribir).

Mis dudas ahora son:

  • ¿Por qué no podía dejar que funcionara la primera regla (según lo sugerido por Kato)?
  • ¿Ves algún agujero de seguridad posible en una regla como la que se me ocurrió?
  • son las reglas que usan las variables "$" necesarias / útiles incluso si no tiene que permitir / denegar la legibilidad / capacidad de escritura de cada documento individual en función de su clave, sino que solo quiere permitir / denegar la legibilidad / capacidad de escritura de un nodo como ¿entero?

Según los nombres de sus registros de usuario, no coinciden con auth.uid , que es probablemente una identificación de inicio de sesión simple , como twitter:2544215 .

Comience por ajustar sus usuarios para que sean almacenados por su uid de inicio de sesión simple:

+ myapp + users + twitter:2544215 + email: "[email protected]" + roles + administrator: true + twitter:2544216 + email: "[email protected]" + roles + moderator: true + ... + documents + -JVmo6wZM35ZQr0K9tJu + ... + -JVr56hVTZxlAI5AgUaS + ... + ...

A continuación, agregue una regla de seguridad para que los administradores puedan acceder a los documents . Aquí tiene un par de opciones, dependiendo de su caso de uso específico.

  1. Para dar a los administradores acceso de escritura a los contenidos de cada documento:

    { "rules": { "documents": { "$documents": { ".write": "root.child(''users'').child(auth.uid).child(''roles'').child(''administrator'').val() === true" } } } }

  2. O, como alternativa, déles acceso a toda la colección:

    { "rules": { "documents": { ".write": "root.child(''users'').child(auth.uid).child(''roles'').child(''administrator'').val() === true" } } }

La diferencia entre estos dos es la variable $documents que mueve la regla de seguridad un paso más hacia la jerarquía.

(Esto fue principalmente una agregación de comentarios de @Kato en forma de respuesta)