2016-08-12 4 views
5
{ 
    "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" } 
       } 
       } 
      } 
} 
  • Я создал эти правила, чтобы пользователи общественности/личный профиль
  • «пользователи/{UID}/общественного» профиль должен быть доступен любым пользователям те прошедшим проверку подлинности, но не может получить доступ к данным в разделе «пользователей/UID»

Вот некоторые поддельные данные, которые хранятся в моей firebase базы данных.Как создать общедоступный/частный профиль пользователя с правилами безопасности 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" : "[email protected]" 
     } 
    }, 
    "YgSfSzPzxLbyDL17r6P9id2cdvH2" : { 
     "Name:" : "Example 2", 
     //This public child should be accessible by 
     //"Example 1" but cannot know the name of 
     // this user 
     "public" : { 
     "email" : "[email protected]" 
     } 
    } 
    } 
} 

Я хочу знать, является ли это надежным способом предотвращения доступа пользователей к важной информации пользователя! В любом случае, я могу улучшить это, используя validate? Я открыт для любых предложений, которые у вас есть. Я хочу создать лучшие и простые правила безопасности для моего приложения.

+0

Просьба проверить ваш заголовок. –

ответ

7

Вы можете определенно обеспечить доступ к частным и общедоступным данным с вашей текущей структурой данных.

Но один прецедент, который вам, скорее всего, захочет в какой-то момент, должен показать список общедоступной информации для всех пользователей. С вашей текущей структурой данных это невозможно, потому что Firebase's security model cannot be used to filter data. Чтобы получить отличный ответ, см. Restricting child/field access with security rules.

Большинство разработчиков разделить государственные и частные данные в совершенно отдельных поддеревьев:

{ 
    "users" : { 
    "YFIIAgwa2kaannrXjwvSZmoywma2" : { 
     "Name:" : "Example 1", 
    }, 
    "YgSfSzPzxLbyDL17r6P9id2cdvH2" : { 
     "Name:" : "Example 2", 
    } 
    }, 
    "public_profiles": { 
    "YFIIAgwa2kaannrXjwvSZmoywma2" : { 
     "email" : "[email protected]" 
    }, 
    "YgSfSzPzxLbyDL17r6P9id2cdvH2" : { 
     "email" : "[email protected]" 
    } 
    } 
} 

Вы можете безопасный доступ с:

{ 
    "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", 
     } 
    } 
    } 
} 

Теперь любой авторизованный пользователь может слушать /public_profiles, что означает, что вы может легко показать список этих профилей.

0

Хм, не было бы легче (re) структурировать db, чтобы у вас было публичное и частное поле для пользователя? Что-то вроде:

{ 
    "users" : { 
    "YFIIAgwa2kaannrXjwvSZmoywma2" : { 
     "private": { 
     "Name:" : "Example 1" 
     }, 
     "public" : { 
     "email" : "[email protected]" 
     } 
    }, 
    "YgSfSzPzxLbyDL17r6P9id2cdvH2" : { 
     "private": { 
     "Name:" : "Example 2" 
     }, 
     "public" : { 
     "email" : "[email protected]" 
     } 
    } 
    } 
} 

/UPD: Таким образом, это должно быть легко (вдовцы), чтобы иметь различные разрешения, потому что они не будут наследовать их от родителей?

+0

Мне нравится, как вы его разделили. Полагаю, я могу это сделать, но не создаст ли это проблему гнездования в будущем, когда я хочу добавить к нему больше данных! Есть ли способ создать отдельное дерево для общедоступных данных? – user2884707bond

+0

Вы можете использовать общедоступный профиль для данных по умолчанию и использовать его для поиска дополнительных вещей в частном поле. Таким образом, у вас не будет беспорядка дублированных полей в частном и общедоступном, которые имеют одинаковые данные. Вы запрашиваете общедоступные данные, затем приватные и объединяете их на стороне клиента. – REJH

+0

Благодарим за помощь: D – user2884707bond

 Смежные вопросы

  • Нет связанных вопросов^_^