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

时间:2013-09-26 00:04:14

标签: angularjs firebase firebase-security

我的原始标题是“如何在Firebase中构建和保护用户(帐户)数据,以确保用户安全访问。”因为这是这个问题的领域,但后来我认为可以形成一个更普遍的问题。说完我熟悉了 https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html
但是和这篇文章一样,它并不适用于我的问题,所以我走了。

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

所以这是我试图保存到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']
    }
  }
});

由于“。”这不起作用。字符。
我应该选择这样的DOT摇杆:

"admin@mydomainDOTcom" : {...}

或者更确切地说,我应该在创建到userData节点时将''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 如何在Firebase中设置安全规则,以便userData的内容始终是只读的,除了在成功购买时写入(例如使用PayPal)? 这可以安全地完成而不必求助于服务器代码吗? 我知道我可以设置安全规则,以便只有服务器可以将数据写入Firebase,但这将涉及服务器端代码,然后编写适当的数据以响应有效的PayPal支付通知(IPN) - 服务器我宁愿避免使用的代码,不仅因为我不太熟悉服务器端编码(虽然应该能够成功接收node.js),还因为LAMP堆叠共享服务器仍然比需要的VPS便宜得多对于节点(aaand我不能做php :()。
客户端代码将使用令人敬畏的Angular.js / angularFire组合开发 感谢你的时间,
贾里德

1 个答案:

答案 0 :(得分:5)

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

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

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

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

    这样可以防止记录被写入一次后被修改。