Основные правила безопасности с 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 поле (свойство).

Каковы правила записи так, чтобы:

  1. Только пользователь, указанный в пользовательском поле моделей (узлов) Book и Action, может иметь доступ для чтения и записи к своим собственным данным? (Значение user Поле в книге и действии должно быть равно значению auth.uid в Firebase для пользователя, чтобы получить права на чтение и запись.)
  2. Что пользователи могут получить доступ только к той информации о модели (узле) пользователя, которая им принадлежит?

Спасибо

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

Другие вопросы по тегам