2016-06-08 2 views
0

Я начинаю писать правила безопасности для своего мобильного приложения, используя firebase. У меня есть ниже правила безопасности прямо сейчасПравила безопасности Firebase проверяют значение новых данных для аутентификации

{ 
    "rules": { 
     ".read": "auth != null", 
     ".write": "auth != null || newData.child('appSecret').val() === '123'", 
     "queue": { 
      "tasks" : { 
      ".indexOn": "_state" 
      } 
     } 
    } 
} 

В правиле записи, я проверяю либо данные auth не является нулевым или данные, вставленные содержит предварительно бесспорное приложение секрет. Вторая часть правила - добавить задачи к firebase-queue, чтобы получить пользовательский токен с сервера для аутентификации пользователя мобильного приложения. Я буду перемещать это правило до /queue/tasks после добавления других правил для приложения.

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

Attempt to write {"appSecret":"123","task":"GET_AUTH_TOKEN"} to /queue/tasks/23232 with auth=null 
    /:.write: "auth != null || newData.child('appSecret').val() === '123'" 
     => false 
    /queue 
    /queue/tasks 
    /queue/tasks/23232:<no rules> 

No .write rule allowed the operation. 
Write was denied. 

Почему операция записи отказано, когда данные вставляются имеет appSecret набор для 123?

Update после ответа Франка

Безопасность не только проверка данных, которая вставляется, но и место, где она установлена. Итак, в моем правиле выше, я пытаюсь сказать, что когда вы вставляете данные в /, убедитесь, что либо пользователь аутентифицирован, либо вставленные данные содержит дочерний элемент appSecret со значением, установленным в 123, и я пытаюсь вставить данные в месте нахождения /queue/tasks/23232. Таким образом, по существу, что я вставив в / является

{ 
    'queue': { 
    'tasks': { 
     '23232': { 
     "appSecret":"123", 
     "task":"GET_AUTH_TOKEN" 
     } 
    } 
    } 
} 

Таким образом, новые данные, вставляемые не содержит ребенок appSecret со значением 123. Я обновил правило до

{ 
    "rules": { 
     ".read": "auth != null", 
     "queue": { 
      "tasks" : { 
      "$taskId" : { 
       ".write": "newData.child('appSecret').val() == '123'", 
      }, 
      ".indexOn": "_state" 
      } 
     } 
    } 
} 

и операция записи разрешена. Конечно, теперь вам нужно будет добавить правила write для других мест в вашей базе данных, потому что с вышеуказанными правилами write не будет разрешено ни в каком другом месте.

ответ

2

Вы пытаетесь написать {"appSecret":"123","task":"GET_AUTH_TOKEN"} по пути /queue/tasks/23232. Таким образом, вы в конечном итоге пишете 123 до /queue/tasks/23232/appSecret.

Ваше правило записи для / говорит, что либо пользователь должен быть аутентификацией, либо новые данные должны содержать /appSecret со значением 123. Так как это не так, запись отклоняется.

+0

Спасибо! Я думал, что правило будет просто проверять новые данные, которые вставляются, не глядя на место, где оно вставлено, но это имеет смысл, как только вы объяснили это. Я смог обновить свое правило и заставить его работать. –

+1

'newData' представляет новые данные в местоположении, поэтому он включает в себя как данные, которые были записаны, так и любые существующие данные в немодифицированном местоположении. –

Смежные вопросы