2016-08-12 15 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" } 
       } 
       } 
      } 
} 
  • Utworzyłem te zasady mają użytkownicy publiczne/prywatne profile
  • "użytkowników/{UID}/publicznego" profil powinien być dostępny dla wszystkich użytkowników tych są uwierzytelnione, ale nie można uzyskać dostępu do danych w ramach „użytkowników/uid

Oto niektóre fałszywe dane, które są przechowywane w moim Firebase bazie.Jak utworzyć publiczny/prywatny profil użytkownika za pomocą reguł bezpieczeństwa 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]" 
     } 
    } 
    } 
} 

Chcę wiedzieć, czy jest to skuteczny sposób, aby uniemożliwić użytkownikom dostęp do krytycznych informacji użytkownika! Czy mimo to mogę to poprawić za pomocą sprawdzania poprawności? Jestem otwarty na wszelkie sugestie, które macie. Chcę tworzyć najlepsze i najprostsze reguły bezpieczeństwa dla mojej aplikacji.

+0

Proszę przeliterować swój tytuł. –

Odpowiedz

7

Zdecydowanie można zabezpieczyć dostęp do prywatnych i publicznych danych za pomocą bieżącej struktury danych.

Ale jeden przypadek, który najprawdopodobniej będziesz chciał w pewnym momencie pokazać listę publicznych informacji dla wszystkich użytkowników. Z obecną strukturą danych, która nie jest możliwa, ponieważ Firebase's security model cannot be used to filter data. Aby uzyskać doskonałą odpowiedź obejmującą to, zobacz Restricting child/field access with security rules.

Większość programistów podzielić dane publiczne i prywatne w całkowicie oddzielnych poddrzew:

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

Można wtedy bezpieczny dostęp z:

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

Teraz każdy uwierzytelniony użytkownik może słuchać /public_profiles, co oznacza, że można łatwo wyświetlić listę tych profili.

0

Hmm, czy nie byłoby łatwiej (ponownie) ustrukturyzować bazę danych, aby dla każdego użytkownika było dostępne publiczne i prywatne pole? Coś jak:

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

/UPD: W ten sposób powinno być łatwe (er) mieć różne uprawnienia, bo nie będzie dziedziczyć ich od rodziców?

+0

Podoba mi się, jak masz to rozdzielone. Przypuszczam, że mogę to zrobić, ale nie stworzy to problemu zagnieżdżania w przyszłości, kiedy chcę dodać do niego więcej danych! Czy istnieje sposób na stworzenie osobnego drzewa dla danych publicznych? – user2884707bond

+0

Możesz użyć profilu publicznego dla "domyślnych" danych i użyć go, aby wyszukać dodatkowe rzeczy w prywatnym polu. W ten sposób nie będziesz miał bałaganu w duplikatach pól prywatnych i publicznych, które mają te same dane. Żądasz danych publicznych, a następnie prywatnych i scalania ich po stronie klienta. – REJH

+0

Dziękuję za pomoc: D – user2884707bond