2016-09-28 2 views
0

Вопрос о ветке кораблей, развернутой ниже. Всюду только аутентифицированным пользователям разрешено записывать свои данные OWN везде. Однако есть одно исключение. ANY аутентифицированный пользователь может читать данные из ветки кораблей.Правило Firebase разрешает только удаление старых данных любым аутентифицированным пользователем

До сих пор у меня не было никаких проблем, но здесь специальное правило:

ANY Авторизованный пользователь может удалить ребенка под любой UID в филиал суда при условии, что метка времени составляет 10 секунд или старше.

Я хочу, чтобы любой пользователь мог позвонить:

firebase.database().ref('/ships/gp3tJa3tgThukt39EejqJpZq12L2/granit').remove(); 

uid: gp3tJa3tgThukt39EejqJpZq12L2 

shipid: granit 

И быть предоставлено право на удаление только.

Для того, чтобы проверить возраст записи хранить в perf массиву firebase.database.ServerValue.TIMESTAMP по индексу 0(я использую массив здесь, потому что эта запись часто обновляется, и я хочу, чтобы сохранить данные к минимуму).

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

Мне нужна помощь, чтобы определить правильное правило. Строка, о которой идет речь, выделена во втором примере, где я попытался определить это правило.

{ 
    "ships": { 
     "EnBawzb0CjZVgAKrMZD4HE3k5rW2": { 
      "oasisoftheseas": { 
       "param": { 
        "scale": 0.33075936163570846, 
        "type": "cruise/royalcaribbean/oasisoftheseas" 
       }, 
       "perf": { 
        "0": 1, 
        "1": 1.11014724E7, 
        "2": 1.70473256E7, 
        "3": 115.7, 
        "timeStamp": 1475144447302 
       } 
      } 
     }, 
     "gp3tJa3tgThukt39EejqJpZq12L2": { 
      "granit": { 
       "param": { 
        "scale": 0.12235531736978282, 
        "type": "riverbarge/granit" 
       }, 
       "perf": { 
        "0": 5, 
        "1": 2.05622392E7, 
        "2": 13154087, 
        "3": 285.9, 
        "timeStamp": 1475144450086 
       } 
      } 
     } 
    } 
} 

Ниже правил. Это правило записи для $ shipid, которое меня интересует правильно.

{ 
    "rules": { 
    "anchors": { 
     "$uid":{ 
     ".read": "auth.uid === $uid", 
     ".write": "auth.uid === $uid" 
     } 
    }, 
    "completed": { 
     "$uid":{ 
     ".read": "auth.uid === $uid", 
     ".write": "auth.uid == $uid" 
     } 
    },  
    "ships": { 
     ".read": "auth !== null", 
     "$uid":{ 
     ".write": "auth.uid === $uid", 
     "$shipid":{ 
      ".write": "((auth !== null) && 
         (now - data.child('perf').child('timeStamp').val() >= 10000))" 
     } 
     } 
    }, 
    "shipslog": { 
     "$uid":{ 
     ".read": "auth.uid === $uid", 
     ".write": "auth.uid === $uid" 
     } 
    }  
    } 
} 
+0

Вы включили изображение дерева JSON в свой вопрос. Пожалуйста, замените это на фактический JSON как текст, который вы легко можете получить, нажав кнопку «Экспорт» в консоли базы данных Firebase. Наличие JSON в качестве текста делает его доступным для поиска, позволяет нам легко использовать его для тестирования с вашими фактическими данными и использовать его в нашем ответе, и в целом это просто хорошая вещь. То же самое для правил. –

+0

Привет, Франк. Я заменил изображения данными JSON. Я обновил правило, и я думаю, что теперь он работает. Тем не менее, я был бы очень признателен за ваши отзывы. Я полагаю, что нет среднего уровня, что такое происходит всегда. Кстати, я абсолютно люблю firebase. Просто начал использовать его и провел большую часть моих дней обучения. –

+1

Эй, Пол.Я скопировал ваши правила в тестовую базу данных, и симулятор разрешает операцию удаления (которую я имитирую, написав «null» на '/ ships/gp3tJa3tgThukt39EejqJpZq12L2/granit'). Разве это не то, что вы пытаетесь? –

ответ

1

Ну, я понял, что подтвердил Фрэнк. Решение, отредактированное в вопросе, является правильным, безопасным и работает.

"ships": { 
     ".read": "auth !== null", 
     "$uid":{ 
     ".write": "auth.uid === $uid", 
     "$shipid":{ 
      ".write": "((auth !== null) && 
         (now - data.child('perf').child('timeStamp').val() >= 10000))" 
     } 
     } 
    },... 

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

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

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

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