¿Cómo crear un perfil de usuario público / privado con las reglas de seguridad de Firebase?

{ "rules": { "users": { "$uid":{ //Private whatever under "uid" but Public is exposed ".read": "auth != null && auth.uid == $uid", ".write": "auth != null && auth.uid == $uid", "public": { ".read": "auth != null" } } } } } 
  • Creé estas reglas para que los usuarios tengan un perfil público / privado
  • El perfil ” users / {uid} / public ” debe ser accesible para cualquier usuario que esté autenticado, pero no puede acceder a los datos en ” users / uid

Aquí hay algunos datos falsos que se almacenan en mi base de datos de firebase.

 { "users" : { "YFIIAgwa2kaannrXjwvSZmoywma2" : { "Name:" : "Example 1", //This public child should be accessible by //"Example 2" but cannot know the name of // this user "public" : { "email" : "example1@gmail.com" } }, "YgSfSzPzxLbyDL17r6P9id2cdvH2" : { "Name:" : "Example 2", //This public child should be accessible by //"Example 1" but cannot know the name of // this user "public" : { "email" : "example2@gmail.com" } } } } 

¡Quiero saber si esta es la forma robusta de evitar que los usuarios accedan a la información crítica del usuario! ¿De todos modos puedo mejorar esto usando validate? Estoy abierto a cualquier sugerencia que ustedes tengan. Quiero crear las mejores y simples reglas de seguridad para mi aplicación.

Definitivamente puede asegurar el acceso a los datos privados y públicos con su estructura de datos actual.

Pero un caso de uso que probablemente desee en algún momento es mostrar una lista de la información pública para todos los usuarios. Con su estructura de datos actual eso no es posible, porque el modelo de seguridad de Firebase no se puede usar para filtrar datos . Para obtener una excelente respuesta que cubra esto, consulte Restricción de acceso de niño / campo con reglas de seguridad .

La mayoría de los desarrolladores divide los datos públicos y privados en subárboles completamente separados:

 { "users" : { "YFIIAgwa2kaannrXjwvSZmoywma2" : { "Name:" : "Example 1", }, "YgSfSzPzxLbyDL17r6P9id2cdvH2" : { "Name:" : "Example 2", } }, "public_profiles": { "YFIIAgwa2kaannrXjwvSZmoywma2" : { "email" : "example1@gmail.com" }, "YgSfSzPzxLbyDL17r6P9id2cdvH2" : { "email" : "example2@gmail.com" } } } 

A continuación, puede asegurar el acceso con:

 { "rules": { "users": { "$uid":{ ".read": "auth != null && auth.uid == $uid", ".write": "auth != null && auth.uid == $uid", } }, "public_profiles": { ".read": "auth != null", "$uid":{ ".write": "auth != null && auth.uid == $uid", } } } } 

Ahora cualquier usuario autenticado puede escuchar /public_profiles , lo que significa que puede mostrar fácilmente una lista de estos perfiles.

Hmm, ¿no sería más fácil (re) estructurar el DB para que tenga un campo público y otro privado por usuario? Algo como:

 { "users" : { "YFIIAgwa2kaannrXjwvSZmoywma2" : { "private": { "Name:" : "Example 1" }, "public" : { "email" : "example1@gmail.com" } }, "YgSfSzPzxLbyDL17r6P9id2cdvH2" : { "private": { "Name:" : "Example 2" }, "public" : { "email" : "example2@gmail.com" } } } } 

/ UPD: ¿De esta manera debería ser fácil (er) tener los diferentes permisos porque no los heredarán del padre?