2016-09-06 2 views
2

У меня есть структура вроде этого:Firebase: позволяет читать коллекцию админами и конкретных записей пользователей

{ "users": { 
    { 
    "uid1" : { 
     "admin" : true, 
     "email" : "[email protected]", 
     "name" : "Admin User" 
    }, 
    "uid2" : { 
     "email" : "[email protected]", 
     "name" : "User 1" 
    }, 
    "uid3" : { 
     "email" : "[email protected]", 
     "name" : "User 2" 
    } 
    } 
} 

У меня есть следующие правила, которые позволяют администратору или сам пользователь, чтобы прочитать данные одного пользователя и работать, как ожидалось:

{ 
    "users": { 
    ".read": true, 

    "$uid": { 
     // data is the user's or user is admin 
     ".read": "root.child('users').child(auth.uid).child('admin').val() == true || auth.uid == $uid", 
    } 
    } 
} 

Что мне нужно сделать, чтобы, в дополнение к тому, что правила уже позволяют, у пользователей администратора иметь возможность перечислить всех пользователей в коллекции?

ответ

4

С Firebase, как только вы предоставите разрешение, вы не сможете отменить его дальше по дереву. Таким образом, ".read": true под номером users предоставляет разрешения на чтение всем пользователям.

Вам необходимо изменить правило под users так, чтобы оно было true только для администраторов. Это также позволит администраторам список пользователей (а также должны увидеть другое правило силу через поведение, которое вы ожидаете):

{ 
    "users": { 
    ".read": "root.child('users').child(auth.uid).child('admin').val() === true", 
    "$uid": { 
     ".read": "root.child('users').child(auth.uid).child('admin').val() === true || auth.uid === $uid", 
    } 
    } 
} 

Это может быть упрощено - как уже упоминалось в комментариях - потому что правило под users каскадами вниз и не требуется повторять:

{ 
    "users": { 
    ".read": "root.child('users').child(auth.uid).child('admin').val() === true", 
    "$uid": { 
     ".read": "auth.uid === $uid" 
    } 
    } 
} 
+2

Поскольку разрешение на чтение администраторов уже каскадируется, вам не нужно повторять разрешение администратора в '' uid'. Это правило может быть просто «.read»: «auth.uid === $ uid» ' –

+0

Ницца! Похоже, я неверно истолковал документацию. Отлично работает, спасибо! –