Я хочу получить данные, сгенерированные пользователем, но получаю ошибку «Отказано в разрешении» в Firebase - PullRequest
0 голосов
/ 03 сентября 2018

Правило, написанное для dummyOrders:

"rules": {
    "dummyOrders":{
      "$dummyid":{
        ".write": "auth!=null && $dummyid.contains(auth.uid)",
        ".read": "auth!=null && $dummyid.contains(auth.uid)"
      }
    }

Структура фиктивных заказов:

-LLKkP5GLMkMqy-OvFsY|3wvZGffGY5gUSKlFzhLw7hwXLEi1
    cemail: "nateshmbhat1@gmail.com"
    cid: "NKGiiChIqCdUcithC48mtuWkaAt1"
    cname: "Natesh Bhat"
    date: "2018-09-01T15:31:25.060Z"
    file_names: "JavaEvaluation.doc,"
    message: "Sample testing. "
    oid: "Order 230"
    status: "requested"
    xid: "ybfXhEkmCNbOuAN0XJYE8b84ix93"
    xshopName: "SIT Campus Xerox"

Когда я запускаю симулятор в Firebase, он не выдает никакой ошибки.

Я пытаюсь получить данные из dummyOrders и правила, которое я написал выше.

Я пытаюсь получить доступ к данным, используя следующий код:

var orderRef = firebase.database().ref('dummyOrders').orderByChild('cid').equalTo(user.uid);

Я получаю сообщение об ошибке «Отказано в доступе». Я новичок в Firebase и, следовательно, мне нужна помощь, чтобы понять, как получить данные, к которым я пытаюсь получить доступ.

Идентификатор dummyorder:

-LLKkP5GLMkMqy-OvFsY | 3wvZGffGY5gUSKlFzhLw7hwXLEi1

UID, с которого пришли данные 3wvZGffGY5gUSKlFzhLw7hwXLEi1, и мне нужно отобразить эти данные в его профиле.

-LLKkP5GLMkMqy-OvFsY Это какой-то магазин, в котором мне тоже нужно показать этот заказ.

Так что для dummyOrder я дал идентификатор как

shopid | Идентификатор_пользователь

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

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 03 сентября 2018

Первое, что нужно отметить, это то, что правила Firebase не являются фильтрами . Поэтому, когда вы пытаетесь получить данные из firebase.database().ref('dummyOrders'), он проверит, есть ли у пользователя разрешение в этом месте. Поскольку у вас нет правил для этого местоположения, Firebase будет использовать значение по умолчанию, которое равно false.

Есть два возможных решения этой проблемы. Во-первых, убедитесь, что вы читаете / пишете из места, которое вы указали в правилах, в данном случае firebase.database().ref('dummyOrders').child($dummyid). Но поскольку вы используете составные ключи и, вероятно, знаете только идентификатор пользователя, я сомневаюсь, что это будет правильным решением для вас.

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

"rules": {
  "dummyOrders":{
    ".read": "query.orderByChild == 'cid' &&
        query.equalTo == auth.uid" // restrict basket access to owner of dummyOrders

    "$dummyid":{
      ".write": "auth!=null && $dummyid.contains(auth.uid)",
      ".read": "auth!=null && $dummyid.contains(auth.uid)"
    }
  }
}

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

...