Основные правила безопасности с Firebase
У меня проблемы с реализацией основных правил безопасности с помощью Firebase (я читаю документацию по Firebase и StackExchange, но не могу заставить работать правила безопасности):
Модель (Emberjs представление модели):
App.User = DS.Model.extend({
uid: DS.attr('string'),
displayName: DS.attr('string'),
books: DS.hasMany('statistic', { inverse: 'user', async: true}),
actions: DS.hasMany('action', { inverse: 'user', async: true}),
});
App.Action = DS.Model.extend({
date: DS.attr('date'),
actionType: DS.attr('string'),
comment: DS.attr('string'),
user: DS.belongsTo('user', {inverse: 'actions', async: true} )
});
App.Book = DS.Model.extend({
name: DS.attr('string'),
description: DS.attr('string'),
user: DS.belongsTo('user', { inverse: 'books', async: true} )
});
3 узла (модели) хранятся непосредственно в корне приложения Firebase. Модели Book и Action имеют user
поле (свойство).
Каковы правила записи так, чтобы:
- Только пользователь, указанный в пользовательском поле моделей (узлов) Book и Action, может иметь доступ для чтения и записи к своим собственным данным? (Значение
user
Поле в книге и действии должно быть равно значениюauth.uid
в Firebase для пользователя, чтобы получить права на чтение и запись.) - Что пользователи могут получить доступ только к той информации о модели (узле) пользователя, которая им принадлежит?
Спасибо
1 ответ
Важно понимать структуру данных в Firebase.
По сути, есть два способа написания правил безопасности. Вы либо устанавливаете правила безопасности прямо под книгами /, либо вы пишете правила безопасности для каждого атрибута модели отдельно. Или комбинация обоих, но сначала убедитесь, что вы понимаете принцип сверху вниз.
Я предпочитаю писать правила для каждого атрибута в отдельности, его легче поддерживать и тестировать.
Но в вашем случае, поскольку другим пользователям не требуется доступ к какой-либо части книг или пользователям, легко написать правила для всей модели:
"rules" :{
"books": {
"$book_id": {
".read": "data.child('user').val() === auth.uid && auth !== null",
".write": "!data.exists() && newData.child('user').val() === auth.uid || data.child('user').val() === newData.child('uid').val() && auth !== null"
},
"users": {
"$user_id": {
".read": "data.child('uid') === auth.uid",
".write": "!data.exists() && newData.child('uid').val() === auth.uid || data.child('uid').val() === newData.child('uid').val()"
}
}
}
}
Я не проверял эти правила, они могут содержать недостатки, используйте инструмент симулятора, чтобы сделать их пуленепробиваемыми:]
Проверьте мою среднюю почту для получения дополнительной информации: https://medium.com/@martinmalinda/emberfire-is-awesome-but-querying-data-and-writing-security-rules-can-be-a-pain-f5370f4decb