【问题标题】:How to set Firebase Database rules? How to prevent .write from deleted user如何设置 Firebase 数据库规则?如何防止已删除用户的 .write
【发布时间】:2026-02-22 04:15:01
【问题描述】:

简介

我正在构建一个 Firebase 网络客户端应用。我想设置 Firebase 数据库规则。

  1. 新用户注册到 Firebase 应用。 Firebase 给了他一个 user.UID。
  2. 然后,管理员从 firebase 管理控制台删除禁用用户。
  3. 用户刷新客户端应用。
  4. (我发现)即使他的帐户已被删除/禁用,用户仍然可以写入 firebase 数据库。

.

目标/意图

我想设置一个规则,当用户不存在禁用阻止访问(.read OR .write)对firebase数据库> 在管理控制台/(身份验证/用户)中。

类似这样的事情:

"rules":{
  "$uid":{
    ".write":"auth.isUserActive(auth.uid) == true"
  }
}

.

FIREBASE 参考文档: https://firebase.google.com/docs/reference/security/database/#auth

问题

我怎样才能达到上述目的?我应该为 firebase DB 设置什么规则?

【问题讨论】:

    标签: firebase firebase-realtime-database firebase-authentication firebase-security


    【解决方案1】:

    删除用户不会撤销该用户的现有令牌。见Firebase authentication not revoked when user deleted?。如果您使用的是标准身份提供商之一,这意味着用户在您删除帐户后一小时内仍然可以访问数据。

    您的代码没有 API 可以检查给定的 uid 是否仍然存在。即使存在这样的 API,在这种情况下也无济于事,因为恶意用户可以绕过检查并直接调用 API。

    处理这种情况的一种简单方法是在数据库中保留允许用户的白名单或不允许用户的黑名单。对于黑名单,您需要保留一个*(世界可读,管理员只能写入)被禁止/删除用户的列表:

    banned
      uid12345: true
    

    当您的管理员删除用户时,他们也会将其添加到此列表中。

    然后在您的安全规则中,您检查并禁止被禁止的用户访问。例如:

    "posts": {
      ".read": "auth != null && !root.child('banned').child(auth.uid).exists()"
    }
    

    【讨论】:

      【解决方案2】:

      您可以按照doc -v2

      ,通过基于用户的安全性来做到这一点
      var FirebaseTokenGenerator = require("firebase-token-generator.js");
      var tokenGenerator = new FirebaseTokenGenerator(FIREBASE_SECRET);
      var token = tokenGenerator.createToken({ "uid": "1", "hasEmergencyTowel": true });
      

      对于上面创建的token,你可以编写如下规则:

      {
        "rules": {
          "frood": {
            ".read": "auth.hasEmergencyTowel === false"
          }
        }
      }
      

      一旦 UID Scope id 即将结束,就可以调用它。

      供参考:User Based Security Doc -v2

      【讨论】:

      • 这对帐户已被删除的用户有何帮助?
      • 正确阅读我的答案 :) 不允许删除,但允许更改用户访问规则。这个函数可以在我们删除用户账号的时候调用!
      • 铸造新代币不会使现有代币失效。这是基于声明的令牌系统所固有的:一旦创建并分发了令牌,您就无法更改其中的声明。什么会调用该函数?如果是客户端应用程序,则恶意用户可以绕过该调用
      • 我更喜欢服务器端解决方案的答案。恶意用户可以绕过客户端代码。