исключение детей из узла firebase с доступом для чтения

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

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

rooms:[
    people:[
        {
            name: //string
            status: // what the user is doing, typing, still connected etc.
            secret: // the problem is with this
        }
    ],
    messages:[
        {/* message to and payload*/}
    ]
]

проблема в том, что я хочу, чтобы пользователь, создавший комнаты [i].people[j], мог обновлять статус этого человека.

Будучи новичком в firebase, я мог бы использовать функцию обновления следующим образом.

personRef.update({
    'status': // newStatus
    'secret': // used to authorize the update
})

проблема в том, что я не могу найти способ сделать секрет только для записи и одновременно предоставить доступ людям. То есть мне нужно, чтобы кто-нибудь мог извлекать данные, расположенные в комнатах [i]. Но это дало бы доступ для чтения каждому ребенку, и любой в комнате мог бы видеть секрет обновления любого другого. Я неправильно думаю об этой проблеме?

Есть ли способ предоставить доступ для чтения родителю, но исключить некоторых дочерних элементов из результатов?

Спасибо!


person Aaron    schedule 11.09.2014    source источник
comment
Можете ли вы немного подробнее рассказать о том, как вы используете секрет человека для его аутентификации (хранится в файле cookie?). Кроме того, как вы регистрируете пользователей? простой логин?   -  person mimming    schedule 11.09.2014
comment
@JennyTong Я просто храню секрет в JS, это одностраничное приложение. Да, это означает, что если они уйдут и вернутся, им придется снова вступить в бой. Я считаю, что это была бы та же проблема, если бы она хранилась в файле cookie.   -  person Aaron    schedule 12.09.2014


Ответы (1)


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

people-secrets:[
    <user's ID>: {
        secret: 
    }, ...
],
rooms:[
    people:[
        {
            name: //string
            status: // what the user is doing, typing, still connected etc.
        }
    ],
    messages:[
        {/* message to and payload*/}
    ]
]

Это позволит вам сегментировать правила безопасности:

{
  "rules": {
    "people-secrets": {
      "$user_id": {
        ".read": "$user_id === auth.uid",
        ".write": "$user_id === auth.uid"
      }
    },
    "rooms": {
      "$room_id": {
        "$user_id": {
          ".read": "auth.uid != null",
          ".write": "$user_id === auth.uid && root.child('people-secrets/' + auth.uid + "/secret") === <that token>"
        }
      }
    }
person mimming    schedule 11.09.2014
comment
Awww, так что пользователю присваивается уникальный идентификатор, даже если этот пользователь анонимный. Это то, чего мне не хватало. Ваше решение, похоже, хорошо сработает, спасибо! - person Aaron; 12.09.2014