2013-06-20 2 views
1

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

Иерархия данных идет:

posts : { 
    0 : { 
     title: "Post One", 
     userId: 6 
    } 
}, 
users : { 
    6 : { 
     name: "My Name" 
    } 
} 

И мои правила:

{ 
    "rules": { 
    "posts" : { 
     "$post": { 
     ".read":"data.child('userId').val() == auth.id", 
     ".write":"newData.child('userId').val() == auth.id" 
     } 
    }, 
    "users":{ 
     "$user": { 
     ".read":"auth.id == $user", 
     ".write":"auth.id == $user" 
     } 
    } 
    } 
} 

Я знаю, что «auth.id» является 6, потому что это тянет правила правильно для моей информации о пользователе , Если я изменю правила, чтобы потянуть номер статически, он будет работать:

но используя auth.id нет. Есть что-то, что мне не хватает?

ответ

5

Следует иметь в виду, что правила безопасности безопасны по типу. В частности, в правилах «6»! = 6 (так как одна строка, а одна - число). Так что, возможно, ваш auth.id «6» (как строка), но ваш userId равен 6 в виде числа?

Если это так, то один потенциальный затруднительное бы изменив выражение правила на что-то вроде:

data.child('userId').val() + '' == auth.id 

, который заставит USERID быть строкой. Кроме того, вы можете изменить свои данные, чтобы убедиться, что userId всегда хранится в виде строки.

+0

Спасибо за быстрые ответы. Симулятор определенно помог. И он идентифицировал проблему, которую вы проиллюстрировали ... это была строка vs int. Ваше правило, похоже, исправило это! – user2488234

+0

Я продолжал искать способ преобразования чисел в строки, мне не приходило просто добавить пустую строку! –

0

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

Ваши правила должны работать нормально, предполагая, что вы пытаетесь одновременно прочитать одно сообщение и предполагаете, что ваша аутентификация настроена правильно.

Быстро предположить, что вы пытаетесь прочитать весь путь «сообщений» и использовать правила безопасности для фильтрации ваших сообщений. Но правила безопасности по сути являются атомными. Если вы попытаетесь прочитать «сообщения», и в одном из сообщений есть правило, которое предотвращает чтение, вся операция будет терпеть неудачу.

Вместо этого вам необходимо сегментировать сообщения в путях, где все данные могут быть прочитаны аутентифицированным пользователем, тогда вы можете применять правила безопасности соответственно.

Одна вещь, которая очень поможет, - это проверить свои правила безопасности, зайдя в вашу Forge и используя «симулятор». Вы можете войти в систему как любой пользователь, затем попробовать прочитать/написать и посмотреть, какие именно правила безопасности терпят неудачу и почему.