Правила безопасности Firebase для чтения только определенных предметов - PullRequest
0 голосов
/ 30 августа 2018

Я новичок в использовании Firebase и чувствую себя полностью потерянным с правилами БД. Мне нужно разрешить пользователям читать элементы, у которых поле владельца равно определенному значению.

У меня есть структура записей:

{
  "books" : {
    "-LKwbZsfy55d24kwX4tf" : {
      "description" : "Adventures",
      "title" : "Captain Donsak",
      "owner" : "b7bS753Hvc0fmQ24Jnc"
    },
    "-LKwc1Xna07nequDtpF6" : {
      "description" : "History",
      "title" : "World War II",
      "owner" : "hLoOnnv4883Vhvm9Vt4"
    },
    "-LKwi4qcsqbgvZPdhCXp" : {
      "description" : "Adventures",
      "title" : "Sea Wolf",
      "owner" : "umV4hFm96vpdwBytx63"
    }
  }
}

Я пробовал несколько вариантов правил, включая следующие (они были предоставлены в документах Firebase), но в любом случае он возвращает 0 пунктов, когда я применяю любое из этих правил.

{
  "rules": {     
    "books": {
        ".read": "data.child('owner').val() === 'umV4hFm96vpdwBytx63'",
        ".write": "auth != null"   
    }
  }
}


{
  "rules": {     
    "books": {
      "$uid":{
        ".read": "root.child('owner').val() == 'umV4hFm96vpdwBytx63'",
        ".write": "auth != null"   
      }        
    }
  }
}

Если я просто укажу

".read": "auth != null"  

возвращает все записи, но это не то, что мне нужно.

Я использую простую команду js для чтения данных:

const itemsRef = firebase.database().ref('books'); 

По сути, мне нужно отфильтровать данные с использованием правил безопасности, но это невозможно, как указано в RenaudTarnec ниже. Поэтому мне придется использовать js для фильтрации:

const itemsRef = firebase.database().ref('books').orderByChild('owner').equalTo(owner); 

Пожалуйста, сообщите, что может быть не так. Спасибо.

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

На самом деле «правила Firebase не являются фильтрами», см. https://firebase.google.com/docs/database/security/securing-data#rules_are_not_filters

Это означает, что для извлечения этих данных вам необходимо использовать запрос, который «согласован» с вашими правилами безопасности.

Как и в JavaScript, см. https://firebase.google.com/docs/database/web/lists-of-data

var query = firebase.database().ref('books').orderByChild('owner').equalTo('umV4hFm96vpdwBytx63');
0 голосов
/ 30 августа 2018

Согласно предложению @ AndréKool, я решил этот вопрос следующим образом: Для фильтрации элементов ответа я использовал правило безопасности на основе запросов :

{ 
  "rules": { 
      "books": { 
          ".read": "query.orderByChild == 'owner' && query.equalTo == auth.uid", 
          ".write": "auth != null" 
        } 
     } 
  }

И я использую js-фильтрацию соответственно:

const itemsRef = firebase.database().ref('books').orderByChild('owner').equalTo(owner);

Спасибо всем за помощь! ; -)

0 голосов
/ 30 августа 2018

Попробуйте это:

{
  "rules": {     
    "books": {
      ".read": "data.child('owner').val() === auth.uid",
      ".write": "auth != null"   
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...