Правила безопасности Firebase data.exists () не работают - PullRequest
0 голосов
/ 26 мая 2018

После сообщения здесь Я создал простое правило безопасности и облачную функцию, которая вызывается, чтобы увидеть, существует ли уже имя пользователя.Проблема в том, что проверка записи правила безопасности всегда проходит и просто устанавливает новое значение в этом месте (/ username_lookup / user1).

Когда я пытаюсь написать в этом месте с помощью симулятора правил базы данных в реальном времени, он работает как положено, т.е. запись заблокирована.

Может кто-то определить проблему?

правило безопасности firebase

"rules": {    
 "username_lookup": {
  "$username": {
     // not readable, cannot get a list of usernames!
     // can only write if this username is not already in the db
     ".write": "!data.exists()",

     // can only write my own uid into this index
     ".validate": "newData.val() === auth.uid"
  }
 }
}

и облачная функция

var fb = admin.database().ref();
createUser(uid, username);

function createUser(userId, usrname) {
    fb.child('username_lookup').child(usrname).set(userId, function(unerr) {
        if(unerr) { 
            res.setHeader('Content-Type', 'application/json');
            res.send(JSON.stringify({error: "the_error_code" }));
         }
     }); 
 }

Снимок экрана объекта / индекса username_lookup enter image description here

1 Ответ

0 голосов
/ 26 мая 2018

You Cloud Functions обращается к базе данных Firebase через:

var fb = admin.database().ref();

Как видите, модуль admin указывает на то, что вы используете Firebase Admin SDK.Одна из ключевых особенностей Firebase Admin SDK:

Чтение и запись данных базы данных реального времени с полными привилегиями администратора.

источник: https://firebase.google.com/docs/admin/setup

Таким образом, Admin SDK фактически обходит ваши правила безопасности.

Также довольно плохая практика использовать обработчик ошибок для базового управления потоком.

Вместо этого используйте транзакцию Firebase длячтение / запись местоположения с именем атомарным способом:

fb.child('username_lookup').child(usrname).transaction(function(value) {
    if (value) {
        res.setHeader('Content-Type', 'application/json');
        res.send(JSON.stringify({error: "the_error_code" }));
        return; // abort the transaction
    }
    else {
        return userId;
    }
}); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...