2017-02-09 7 views
0

Я создал приложение для чата с использованием Firebase, а иногда и чат-пользователи наводняют чемпиона, и я хочу его заблокировать.Правила Firebase: Отключить запись для имени пользователя

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

chat_blocks/USERNAME_TO_BLOCK:true 

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

".write": "!root.child('chat_blocks/'+newData.child('username').val()).exists()" 

Но он заблокировал все.

Моя структура проста, как:

chat_messages 
-$key 
-- username 
-- message 

chat_messages/--list of messages 
+0

Возможно, полезно добавить свое текущее дерево базы данных. – eshirima

+0

@EmilDavid Извините, забыл об этом. Это самое простое, я добавил структуру – TheUnreal

+0

Первое, знаете ли вы, что в правилах Firebase правило, объявленное в родительском узле, применяется ко всем его дочерним элементам? – eshirima

ответ

0

Я сделал некоторые раскопки и нашел два решения.

1. Установить запрет на пользователя

Рассмотрим добавление bannedFor узел под users дерева. Тогда все, что вы должны сделать, это пойти в users узел и убедитесь, что информация не существует, и дать им доступ к обоим .read и .write

users 
    $uid 
    "bannedUntil": 1486599300 

Теперь, когда речь идет о правилах, это будет выглядеть как это

{ 
    "rules": { 
    "users": { 
     "$uid": { 
     ".read": "!data.child('bannedUntil').exists() || data.child('bannedUntil').val() < now" 
     } 
    } 
    } 
} 

2. Установите скорость сообщение

ограничить количество сообщений, которые пользователь может отправить в определенном временном интервале. Я нашел jsfiddle вместе с rules для этого решения.

Дроссельные сообщения не более чем один каждые 5000 миллисекунд

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

+0

Это отличная альтернатива. Мои пользователи хранятся на моей стороне сервера, а не в моей firebase, поэтому в настоящее время это не актуально. – TheUnreal