如何设置Firebase数据库规则?如何防止已删除用户的.write

时间:2016-07-05 05:19:55

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

简介

我正在构建一个firebase Web客户端应用程序。我想设置Firebase数据库规则。

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

    我想在用户不存在禁用时设置阻止访问(。read或.write)到firebase数据库的规则>在管理控制台/(身份验证/用户)。

    有些事情是这样的:

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

    FIREBASE REFERENCE DOC: https://firebase.google.com/docs/reference/security/database/#auth

    问题

    我如何达到上述目的?我应该为firebase DB设置哪些规则?

2 个答案:

答案 0 :(得分:2)

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

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

处理此方案的一种简单方法是在数据库中保留允许或黑名单的不允许用户的白名单。对于黑名单,您要保留一个禁止/删除用户的顶级(世界可读,仅管理员可写)列表:

banned
  uid12345: true

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

然后在您的安全规则中,您检查并禁止禁止用户访问。 E.g:

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

答案 1 :(得分:0)

您可以按照doc -v2

基于用户的安全性来执行此操作
var FirebaseTokenGenerator = require("firebase-token-generator.js");
var tokenGenerator = new FirebaseTokenGenerator(FIREBASE_SECRET);
var token = tokenGenerator.createToken({ "uid": "1", "hasEmergencyTowel": true });

对于上面创建的令牌,您可以按如下方式编写规则:

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

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

供参考:User Based Security Doc -v2