Firebase: cómo estructurar los datos de usuario públicos / privados

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

Opción 1: Have /users/$uid legible solo por ese usuario y que sea legible por / anyone /users/$uid/profile .

Opción 2: mantener /users/$uid legible solo por ese usuario y tener 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.

La forma más fácil de ver por qué la estructura “más plana” es mejor es ver cómo la protegerías y cómo implementarías 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 principales razones 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 toda la lista 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 usuario públicos, haría:

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

Esto funcionará, porque todos han leído el permiso en los profiles .