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() или один раз() для/сообщений не удалось: Ошибка: permission_denied: у клиента нет разрешения на доступ к требуемым данным.

Если у кого-то есть решение, это будет потрясающе!

Ответы

Ответ 1

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

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

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

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

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

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

/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