首页 文章

如何在复杂的安全规则要求的背景下对Firebase中的数据进行非规范化/结构化?

提问于
浏览
2

我原来的 Headers 是"How to structure and secure user (account) data in Firebase for secure user access.",因为这是这个问题的领域,但后来我认为可以形成一个更普遍的问题 . 说完了我就熟悉了
https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html
但是就这篇文章而言,它并不适用于我的问题,所以我走了 .

首先,我将使用简单登录电子邮件/密码验证类型(但如果验证用户的电子邮件必须涉及服务器端编码,则可能会使用Persona) .
我有一个userData对象,其中存储有用户数据(读取用户帐户) . 要求每个用户只能读取存储在自己帐户中的数据 . 所有用户将访问的实际数据将存储在名为comingData的单独节点中 .
用户可以访问来自immediateData的哪些数据将取决于用户购买的类型:
具有"subscription"类型的用户将能够访问所有数据,直到他们的订阅到期为止 . 我假设"now"变量可用于通过安全表达式实现此目的 .
具有"purchase"类型的用户只能访问购买的数据(在数组中列出) .
admin@mydomain.com需要能够读取所有用户的所有数据,但只能写入(并读取)即将到来的DATA节点 .

所以这是我试图保存到Firebase的测试数据结构:

new Firebase(url).update({
  userData: {
    "admin@mydomain.com" : {
      subscription : {expire : '9999999999999'},
      purchase : []
    },
    "testUser@somwhere.com" : {
      subscription : {expire : '1379904665974'},
      purchase : ['upcomingData/-J47idp64ANBRmFS5rVY', 'upcomingData/-J47idpHg-pwzW1c-rfw', 'upcomingData/-J47idpLfIhlUQWTPc9y']
    },
    "testUser2@somwhereelse.co.uk" : {
      subscription : {expire : '1379904734517'},
      purchase : ['upcomingData/-J47idp64ANBRmFS5rVY', 'upcomingData/-J47idpHg-pwzW1c-rfw', 'upcomingData/-J47idpLfIhlUQWTPc9y']
    }
  }
});

这不是't work because of the ' . 字符 .
我应该像这样去DOT mangle:

"admin@mydomainDOTcom" : {...}

或者更确切地说,我应该创建用户帐户到userData节点并将用户的用户名保存为{"id":"admin@mydomain.com"}属性?
如何在Firebase中设置安全规则,以便userData的内容在任何时候都是只读的,除了在成功购买时写入(比如使用PayPal)?
这可以安全地完成而无需借助服务器代码吗?
我知道我可以设置安全规则,以便只有服务器可以将数据写入Firebase,但这将涉及服务器端代码,然后编写适当的数据以响应有效的PayPal支付通知(IPN) - 服务器我不太熟悉服务器端编码的代码(尽管应该能够成功接收node.js),但也因为LAMP堆叠共享服务器仍然比节点所需的VPS便宜得多(aaand我不能做php :() .
将使用令人敬畏的Angular.js / angularFire组合开发客户端代码 .
感谢你的时间,
贾里德

1 回答

  • 5

    这里有两个不同的问题,分别处理:

    • 对于“ . ”字符,您可以用“,”替换它们 . 简单登录将自动为您执行此操作,例如,如果您使用的是角色提供程序,则可以通过userObject.id(以及userObject.email中的真实电子邮件地址)访问转义的电子邮件地址 .

    • 要创建只读记录(第一次除外),您可以使用如下规则:

    ".write": "!data.exists()"
    

    这将防止记录被写入一次后被修改 .

相关问题