update reglas data auth firebase firebase-database firebase-realtime-database firebase-security

reglas - Firebase: Cómo estructurar datos de usuarios públicos/privados



firebase web (1)

La forma más fácil de ver por qué la estructura "más plana" es mejor es ver cómo la aseguraría y cómo implementaría la funcionalidad.

Tu primera estructura es:

users: { uidOfJacob: { stackId: 884522, ssn: "999-99-9999", profile: { displayName: "Jacob Philips" } }, uidOfPuf: { stackId: 209103, ssn: "999-99-9999", profile: { displayName: "Frank van Puffelen" } } }

Lo asegurarías con:

{ "rules": { "users": { "$uid": { ".read": "auth.uid == $uid", ".write": "auth.uid == $uid" "profile": { ".read": true } } } } }

Una de las razones principales para tener información pública es poder mostrar una lista de esa información. En JavaScript:

ref.child(''users'').child(???).child(''profile'').on(''child_added''...

Esto no funcionará, porque ¿qué ponemos ??? . Las operaciones de Firebase deben poder leer la lista completa desde una ubicación, y el usuario debe tener permiso de lectura en esa ubicación completa (no solo en los nodos secundarios individuales).

Si estructuramos los datos para separar la información pública de la información privada, obtenemos:

users: { uidOfJacob: { stackId: 884522, ssn: "999-99-9999", profile: { displayName: "Jacob Philips" } }, uidOfPuf: { stackId: 209103, ssn: "999-99-9999", profile: { displayName: "Frank van Puffelen" } } }, "profile": { uidOfJacob: { displayName: "Jacob Philips" }, uidOfPuf: { displayName: "Frank van Puffelen" } }

Lo asegurarías con:

{ "rules": { "users": { "$uid": { ".read": "auth.uid == $uid", ".write": "auth.uid == $uid" } }, "profiles": { ".read": true, "$uid": { ".write": "auth.uid == $uid" } } } }

Para no obtener una lista de los perfiles de usuarios públicos, haría lo siguiente:

ref.child(''profiles'').on(''child_added''...

Esto funcionará, porque todos tienen permiso de lectura en los profiles .

Naturalmente, los usuarios en mi base de datos tienen información que puede ser accesible públicamente y otra información que solo ellos deberían ver. Estoy considerando dos formas diferentes de implementar esto.

Opción 1: Hacer que /users/$uid legible solo por ese usuario y que /users/$uid/profile sea ​​legible por cualquier persona.

Opción 2: Mantenga /users/$uid legible solo por ese usuario y tenga un /profiles/$uid que sea público. Esto sigue la recomendación de una estructura de datos más plana, pero no veo cómo es mejor en este caso.