【问题标题】:Firebase add users but disable any modificationFirebase 添加用户但禁用任何修改
【发布时间】:2016-07-12 09:47:34
【问题描述】:

陷入了这个问题:我想允许用户使用 firebase 在我的网页上注册,因此我计划了以下结构:

users : {
    user0 : { //user specific data },
    user1 : { //... }
    ...
}

在我更改安全规则之前,一切正常(写作、阅读……)。我想更改它们,因为我希望用户只注册并且无权删除他们或潜在的其他用户帐户。但我找不到任何对此很有帮助的东西。以下是我目前剩下的:

{
"rules": {
    "users" : {
          ".read": true,
          "$uid" : {            
          ".write": "auth !== null && auth.uid === $uid"
       }
    }
}
}

我想知道如何设置规则以使用户只能添加新帐户。

我将不胜感激!

谢谢:)

编辑:这是我想用上面的规则实现的,也许下面使用模拟器的例子会让我的观点更清楚。

我要做的第一件事是让用户在 /users 节点上注册。因此,我在模拟器中选择了Custom Auth点:

{ 提供者:'匿名',uid:'002a448c-30c0-4b87-a16b-f70dfebe3386' }.

现在,如果我选择“模拟写入”并给出路径 /users 和以下键值对:

{ "002a448c-30c0-4b87-a16b-f70dfebe3386": { "1" : {"a" : "b"}}}

我收到以下消息(请参阅 Result_2),它告诉我,我无法写入 /users,因为没有允许它的写入规则,我在上述安全规则配置中完全理解,但我不知道如何更改它们,以便我能够像上面那样编写键值对,同时仍然允许每个用户在该条目上写入 only。 IE。 uid 为 002a448c-30c0-4b87-a16b-f70dfebe3386 的用户只要经过身份验证,就可以使用上述规则写入相应的值(参见 Result_1)。

例如Custon Auth 经过身份验证的用户在他的条目上写:(按预期完美运行)

{ 提供者:'匿名',uid:'002a448c-30c0-4b87-a16b-f70dfebe3386' }.

和上次一样。现在,在路径上“模拟写入”:

/users/002a448c-30c0-4b87-a16b-f70dfebe3386

结果_1:

尝试使用 auth={"provider":"anonymous","uid" 将 {"4":{"name":"fred"}} 写入 /users/002a448c-30c0-4b87-a16b-f70dfebe3386: "002a448c-30c0-4b87-a16b-f70dfebe3386"}

/

/用户

/users/002a448c-30c0-4b87-a16b-f70dfebe3386:.write: "auth !== null && auth.uid === $uid" => true

允许写入。

结果_2:将用户写入 /users 节点失败,即无法注册。我希望在这里能够将用户添加到 /users 但不能从 /users 修改/删除用户。请参阅下面的模拟器输出。

尝试使用 auth={"provider":"anonymous" 将 {"002a448c-30c0-4b87-a16b-f70dfebe3386":{"1":{"a":"b"}}} 写入 /users, "uid":"002a448c-30c0-4b87-a16b-f70dfebe3386"}

/

/users 没有 .write 规则允许该操作。

写入被拒绝。

【问题讨论】:

    标签: firebase firebase-security


    【解决方案1】:

    权限级联 - 一旦您授予用户对 /users 的权限,您就不能再删除对 /users/$uid 的权限。

    解决方案是仅授予最低级别的权限,因此在您的情况下:

    {
      "rules": {
        "users" : {
            ".read": true,
            "$uid" : {
              ".write": "auth !== null && auth.uid === $uid"
           }
        }
      }
    }
    

    【讨论】:

    • 嗯,但是没有人可以写入 /users(在模拟器上用自定义身份验证模式尝试过)。那么,我应该如何将 uid 添加到 /users ?此外,由于 ".read": true other 每个用户都可以从其他用户那里读取内容,这也不应该是这种情况:(。老实说,我不明白为什么 firebase 不选择对 CRUD 操作设置规则,但这是另一个故事...
    • 使用我的.write 规则,任何人都可以写入自己的特定节点。如果您使用uid Tukk 对模拟器进行身份验证,然后写入/users/Tukk,它将被允许。
    • 是的,这是正确的,但前提是节点 Tukk 已经存在。如果它不存在,除了在 firebase 上以管理员身份登录并手动执行之外,不可能创建它,但是,我想让用户在 /users 上注册自己。抱歉,如果我没有明确指出。
    • Firebase 会在您向其写入值时自动创建路径。您不需要路径上的许可,只需要您正在编写的值。如果某些东西对您不起作用:编辑您的问题以包括您在模拟器中写入的位置、您正在写入的值、您拥有的规则以及模拟器为您提供的输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2021-08-12
    • 2015-09-07
    相关资源
    最近更新 更多