2016-07-31 1 views
1

При использовании .read с истинным правилом на узле Users я предоставляю доступ к некоторому аутентифицированному пользователю, который читает каждый пользователь, указанный на этом дереве. Мне нужно только некоторое время.Правило Firebase, которое работает как фильтр

Мне нужно некоторое правило, которое работает как фильтр. Таким образом, при получении User/path этот аутентифицированный пользователь получит массив пользователей только тех, у кого есть путь разрешения, подобный этому $uid > permission > auth.uid = true.

{ 
    "rules": { 
    "Users" : { 
     ".read": true, 
     "$uid" : { 
     ".read" : "(auth != null && auth.uid === $uid) || root.child('Users/'+ $uid+'/permission/'+ auth.uid).val() == true", 
     ".write" : false 
     } 
    }, 
    } 
} 
+1

См. Http://stackoverflow.com/questions/14296625/restricting-child-field-access-with-security-rules –

ответ

2

Вы не можете использовать правила в качестве фильтров, они являются атомарными для конкретной ветви, которую вы пытаетесь прочитать/записать.

Ваше внешнее правило чтения дает доступ ко всей ветке /Users. Удалив его и получив userId, который вы хотите прочитать, вы получите поведение, которое ожидаете. Таким образом, к сожалению, это будет работать только при чтении с ref.child("Users").child(targetUserId).once....

{ 
    "rules": { 
    "Users" : { 
     "$uid" : { 
     ".read" : "(auth != null && auth.uid === $uid) || root.child('Users/'+ $uid+'/permission/'+ auth.uid).val() == true", 
     ".write" : false 
     } 
    } 
    } 
} 

Если вы хотите иметь, в одном вызове, список пользовательских идентификаторов, что идентифицированный пользователь имеет доступ к рекомендую вам на самом деле сохранить доступные пользователям внутри /User/userId вместо того, чтобы те, может читать. И ваши правила немного изменятся.

{ 
     "rules": { 
     "Users" : { 
      "$uid" : { 
      ".read" : "(auth != null && auth.uid === $uid) || root.child('Users/'+ auth.uid +'/accessibleUsers/'+ $uid).val() == true", 
      ".write" : false 
      } 
     } 
     } 
    } 

Кроме того, это может стать сложным при масштабировании так, в зависимости от того, что вы планируете для вашего приложения, вы должны думать, иметь этот список доступных пользователей в отдельной отрасли (за пределами пользователей).

+0

Получаю. Я был на пути к этому [статье] (https://www.airpair.com/firebase/posts/structuring-your-firebase-data), поэтому я столкнулся с этой проблемой. Я попробую ваш подход. – calebeaires