5

我在使用 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 字段中标识的用户才能对自己的数据进行读写访问?(userBook 和 Action 中的字段值必须等于auth.uidFirebase 中的值,用户才能被授予读写权限。)
  2. 用户只能访问属于他们的用户模型(节点)的信息吗?

谢谢

4

1 回答 1

2

了解 Firebase 中的数据结构非常重要。

基本上,有两种编写安全规则的方法。您可以在 books/ 下设置安全规则,也可以分别为每个模型属性编写安全规则。或两者兼而有之,但请确保您首先了解自上而下的原则。

我更喜欢分别为每个属性编写规则,这样更易​​于维护和测试。

但是在您的情况下,由于其他用户不需要访问书籍或用户的某些部分,因此很容易为整个模型编写规则:

"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

于 2015-09-03T16:19:21.903 回答