FireBase - как вывести список пользовательских данных?

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

В настоящее время я внедрил простую систему входа в систему. Авторизовавшись со своей почтой и паролем после регистрации, я создаю такой пост:

post = {
 name: "Hi",
 message: "Guys",
 user_id: Auth.user.id // for my current user this is 1
}
posts.$add(post)

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

Другие пользователи могут читать чужие сообщения, имея общедоступную логическую переменную (но это на потом)

Я смотрел API безопасности Firebase (см .: https://www.firebase.com/docs/security/security-rules.html) Сейчас у меня есть:

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

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

posts = new Firebase(base + '/posts')
posts = $firebase(posts)

Ошибка: FIREBASE WARNING: on () или once () для / posts не удалось: Ошибка: permission_denied: у клиента нет разрешения на доступ к нужным данным.

Если у кого-то есть решение, это было бы здорово!


person Peter Willemsen    schedule 01.02.2014    source источник


Ответы (1)


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

Например, храните записи по идентификаторам групп или пользователей:

/posts/$group/data...
/posts/$user/data...

А затем вы можете убедиться, что у ваших пользователей есть разрешения, назначив их соответствующим группам и просто получив сообщения для этих групп:

var ref = new Firebase(base + '/posts/' + GROUP_ID);
var posts = $firebaseArray(ref);

Или вы можете создать индекс сообщений, которые может просматривать каждый пользователь / группа / и т. Д.:

/posts/$post_id/data...
/posts_i_can_view/$user_id/$post_id/true

И получить их по отдельности из главного списка. Такой инструмент, как Firebase-util, значительно упростит это:

var fb = new Firebase(base);
var ref = Firebase.util.NormalizedCollection(
   fb.child('posts_i_can_view/'+USER_ID),
   fb.child('posts')
)
.select('posts.message', 'posts.user_id')
.ref();

var posts = $firebaseArray(ref);

Дальнейшее чтение структур данных Firebase:

https://www.firebase.com/docs/web/guide/structuring-data.html https://www.firebase.com/docs/web/guide/understanding-data.html https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html

person Kato    schedule 02.02.2014
comment
Привет, Спасибо за объяснение. Это действительно показало, что все в перспективе, мне это действительно нужно в дополнение к исходной документации. Спасибо, что нашли время объяснить это с моей точки зрения! - person Peter Willemsen; 02.02.2014
comment
Конечно! Вы также можете посетить блог Firebase о денормализации и 2 серии статей по запросам SQL для дальнейшего чтения :) - person Kato; 02.02.2014
comment
Именно туда я и отправился после прочтения вашего ответа! :) Кстати, сейчас он действительно хорошо работает. Я добавил отдельный объект сообщений в Firebase (как в вопросе). Затем в моем объекте пользователя я храню список идентификаторов сообщений, предназначенных для этого пользователя. Таким образом, я все еще могу перечислять сообщения для конкретного пользователя и при этом поддерживать необходимый ему уровень безопасности. - person Peter Willemsen; 03.02.2014
comment
@Kato Я считаю твой ответ полезным. Помогите мне кое-что понять. Предлагаемая вами структура /posts/$user/data не соответствует структуре, предложенной в этом статья о денормализации, верно? - person Christiaan Westerbeek; 24.04.2015
comment
Какая структура предлагалась где? Их несколько, и я не вижу противоречий. - person Kato; 24.04.2015