2

У меня возникает проблемы при попытке следующего правила проверки:Firebase правила безопасности, проходящее через базу данных для проверки

  ".validate": "newData.val() >= now - 2000 && newData.val() >= data.parent().parent().parent().parent().parent().child('users/'+auth.uid+'/lastPostAt').val() - 2000" 

Вот соответствующий район моей схемы базы данных Firebase:

areas 
    -> area1 
     -> posts 
      -> uid 
       -> post object (has timestamp property (date) - firebase timestamp) 


user 
    -> uid 
     -> user object (has timestamp property (lastPostAt) - Firebase timestamp) 

Когда отправляется сообщение, оно обновляет свойство timestamp lastPostAt в объекте пользователя для конкретного пользователя, отправившего сообщение.

Что я ищу - это некоторые правила Firebase, чтобы гарантировать, что при отправке нового сообщения он не будет сохранен, если пользователь не отправил другое сообщение в течение последних 2 минут.

Я смотрю на этот post на StackOverflow, но я пытаюсь посмотреть, возможно ли это сделать с моей реализацией.

Под $uid для моих сообщений узла, я пробуя .validate правила:

 "posts" : { 
      "$message_id": { 
       ".indexOn": "username", 
       ".write": "newData.hasChildren(['date'])", 
       "date" : { 
        ".validate": "newData.val() >= now - 2000 && newData.val() >= data.parent().parent().parent().parent().parent().child('users/'+auth.uid+'/lastPostAt').val() - 2000" 
      } 

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

+2

Почему вы удалили [свое предыдущее сообщение] (http://stackoverflow.com/questions/41124660/firebase-rules-to-prevent-spam) и добавить новый? Если у вас есть детали для добавления, добавьте их в свой первоначальный вопрос в следующий раз. –

+0

Вы можете использовать 'root.child ('users /' + auth.uid + '/ lastPostAt')' вместо 'data.parent(). Parent(). Parent(). Parent(). Parent(). Child ('пользователей /' + auth.uid + '/ lastPostAt') ' –

ответ

2

Если вы хотите, чтобы предотвратить дополнительные сообщения в течение двух минут, newData.val() должно быть по крайней мере 120 000 миллисекунд больше, чемlastPostAt.

Так что ваше правило должно быть:

"date" : { 
    ".validate": "newData.val() >= now - 2000 && newData.val() >= data.parent().parent().parent().parent().parent().child('users/'+auth.uid+'/lastPostAt').val() + 120000" 
} 

Кроме того, если вы используете ServerValue.TIMESTAMP, вы можете использовать:

newData.val() === now 

Используя это в правиле бы предотвратить произвольные, будущие временные метки от использования , (И если вы не используете ServerValue.TIMESTAMP, вам следует использовать его.)