2015-06-09 6 views
4

У меня есть ниже данные, которые хранятся в моем firebase:firebase разрешения безопасности не работает

firebaseRoot 
    admins 
     simplelogin:1: 
    users 
     simplelogin:1 
      email: [email protected] 
      picture: csd 
      provider: password 
      uid: simplelogin:1 
     simplelogin:2 
      email: [email protected] 
      picture: zsd 
      provider: password 
      uid: simplelogin:1 

и следующие правила безопасности:

{ 
    "rules": { 
    "admins": { 
     ".read": "root.child('admins').child(auth.uid).val() === true", 
     ".write": "root.child('admins').child(auth.uid).val() === true" 
    }, 
    "users": { 
     "$user":{ 
     ".read": "$user === auth.id || root.child('admins').child(auth.uid).val() === true", 
     ".write": "$user === auth.id" 
     } 
    } 
    } 
} 

Мои требования авторизации, как показано ниже.

  1. Администраторы могут быть прочитаны и добавлены только существующим администратором. Это работает.
  2. Все пользователи могут быть прочитаны администратором, но не могут писать данные пользователя.
  3. пользователь может читать и обновлять свои пользовательские данные.

В настоящее время с приведенными выше правилами я не могу читать данные пользователей как для администраторов, так и для пользователей. Я получаю ниже сообщения об ошибке. Пожалуйста, предоставьте свою помощь. Благодарю.

var rootRef = new Firebase('https://xxxxx.firebaseio.com/'); 
var users = rootRef.child('users'); 
users.on('value', function(snap) { 
console.log(snap.key(), snap.val()); 
}, function(error) { 
console.log(error); 
}); 

Ошибка:

Error: permission_denied: Client doesn't have permission to access the desired data.

ответ

3

Есть два нюанса, когда речь идет о Firebase правила безопасности:

  1. rules cascade

    Это означает, что когда вы даете кому-то (читать или write) на определенном уровне в структуре JSON, вы не можете принять это право awa у больше на более низком уровне

  2. rules are not filters

    Это означает, что вы можете прочитать только узел, если вы прочтете доступ ко всем данным в этом узле. Если у вас есть доступ только для чтения к части данных, операция чтения для полных данных не будет выполнена.

В правилах безопасности, вы только дать разрешение на чтение (некоторые) детей под users. Поэтому попытка прочтения всего users.on('value' потерпит неудачу.

Вы можете решить эту проблему, предоставив администратору .read доступ к узлу users.

"users": { 
     ".read": "root.child('admins').child(auth.uid).val() === true", 
     "$user":{ 
     ".read": "$user === auth.id", 
     ".write": "$user === auth.id" 
     } 
    } 
+0

Спасибо Frank. Я почти отказался от безопасности бомбы. Я снова и снова читал документацию по правилам безопасности, но я не мог получить ее полностью, но ваш ответ заставляет меня понять, насколько прост и изящный. Я просто не могу поблагодарить! – Ajay

+1

Добро пожаловать. Мы знаем, что оба они не интуитивно понятны, но особенно это # ​​2 иногда усложняет реализацию функций, чем нам бы хотелось. Но пока все, что мы можем сделать, это объяснить. Продолжайте взломать и продолжайте спрашивать! –

1

Вот мой рабочий пример:

ajsecuretest 
    roles 
     simplelogin:1 
      role: 'admin' 
     simplelogin:2 
      role: 'editor' 
    users 
     simplelogin:1 
      email: '[email protected]' 
      picture: 'a.jpg' 
      provider: 'password' 
      uid: 'simplelogin:1' 
     simplelogin:2 
      email: '[email protected]' 
      picture: 'b.jpg' 
      provider: 'password' 
      uid: 'simplelogin:2' 

Правила:

{ 
    "rules": { 
    "roles":{ 
     ".read": "root.child('roles').child(auth.uid).child('role').val() === 'admin'", 
     ".write": "root.child('roles').child(auth.uid).child('role').val() === 'admin'", 
     "$id" : { 
     ".read" : "$id === auth.uid" 
     } 
    }, 
    "users": { 
     ".read" : "root.child('roles').child(auth.uid).child('role').val() === 'admin'", 
     "$user":{   
     ".read": "$user === auth.uid", 
     ".write": "$user === auth.uid" 
     } 
    } 
    } 
} 
Смежные вопросы