在Firebase中实现“读取”和“写入”安全规则

时间:2013-05-15 14:58:29

标签: backbone.js hash firebase user-roles firebase-security

在我的应用程序中,我想要一个“可以阅读” - 和一个“可以写”视图。当应用程序启动时没有现有参数(“第一次用户”),然后创建2个随机哈希值,以及firebase应用程序密钥,将它们发布到PHP FirebaseTokenGenerator以接收我的令牌。

然后我想这样做:

  • 第一个哈希(“read hash”)表示“匿名用户”条目
  • 第二个哈希(“写哈希”)表示“密钥”,它是用户条目的子条目

看起来像这样:

<appname>
    users
        <read_hash>
            key
                <write_hash>
            [other user related data]
                ...

哈希值可用作网址参数,例如“myapp.com/#read_hash/write_hash”

我想要实现的目标是:

  • 当用户只有他的read_hash(只调用“myapp.com/#read_hash”)时,他应该能够看到他第一次输入的所有条目(让应用为他创建write_hash /“key”) )。但他不允许修改它们。
  • 当他提供write_hash(调用“myapp.com/#read_hash/write_hash”)时,允许写入Firebase。

我的安全规则:

{
    "rules": {
        "users": {
            "$user": {
                ".read": "$user == auth.read_hash",
                ".write": "$user == auth.read_hash && root.child('users').child($user).child('key').val() == auth.write_hash"
            }
        }
    }
}

我的问题是:如何在没有我的安全规则“.write”阻止写入的情况下第一次存储write_hash?

任何其他想法如何实现这一目标?任何架构/不一致?

我正在使用这些库:

  • Backbone JS with backbone-firebase.js
  • FirebaseTokenGenerator PHP

提前致谢。

2 个答案:

答案 0 :(得分:2)

首先,我应该注意,您应该从不将Firebase Secret放入您的应用中。它应始终安全地存储在安全的服务器上。您的原始问题表明您正在将令牌从客户端发送到服务器。

我建议让read_hash与用户ID相同,然后在第一次创建用户时在//键处存储“key”。

然后我建议如下规则结构:

{
  "rules": {
    "$userid": {
      ".read": "$userid == auth.read_hash",
      ".write": "!data.exists() || ($userid == auth.read_hash && data.child("key") == auth.write_hash)",
    }
  }
}

答案 1 :(得分:1)

假设您已经拥有了写入哈希的密钥(因为您已经根据您的示例进行了身份验证),这将有效:

{
    "rules": {
        "users": {
            "$user": {
                ".read": "$user == auth.read_hash",
                "$key": {
                    ".write": "$user == auth.read_hash && $key === auth.write_hash"
                }
            }
        }
    }
}

如果你需要在获取密钥之前创建哈希,对于一些奇怪的用例(不太可能,但这会给你一些关于安全规则的关键见解),你可以这样做:

".write": "$user == auth.read_hash && (!data.exists() || $key === auth.write_hash)"