Firebase数据库安全规则适用于模拟器,而不适用于Java代码

时间:2017-01-22 23:26:30

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

我想阻止添加时间戳早于现有数据的数据。样本数据库:

{
  "latest" : {
    "517" : {
      "PARAM1" : {
        "timestamp" : 11492,
        "value" : 6593
      }
    }
  }
}

Firebase安全规则:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",

    "latest": {
        "$id": {
            "$param": {
                "timestamp": { ".validate": "newData.val() >= data.val()" }
            }
        }
    }
  }
}

现在,有趣的部分。当我检查从模拟器添加不同的数据时 - 它按预期工作。 Smaler时间戳被拒绝,更高的时间戳被添加。但它对从Java代码中添加SAME数据没有任何影响。

应拒绝的样本数据:

/latest/517
{
  "PARAM1" : {
    "timestamp" : -5,
    "value" : 643
  }
}

我使用com.google.firebase:firebase-admin:4.0.3与纯Java一起使用,如Admin Database API部分所述。

POJO:

public class TimeValue {

    public long timestamp;
    public double value;

    public TimeValue(long timestamp, double value) {
        super();
        this.timestamp = timestamp;
        this.value = value;
    }

}

插入:

Map<String, TimeValue> timeValue = new HashMap<String, TimeValue>();
timeValue.put("PARAM1", new TimeValue(-5L, 643));

final FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference idRef = database.getReference("latest/517");
idRef.setValue(timeValue);

为什么这样工作?它没有任何意义。

1 个答案:

答案 0 :(得分:3)

当您使用firebase作为管理员或服务帐户时,不会检查验证规则 - 因为,您是管理员:)

如果您只是想要正常访问数据库,则只需以普通帐户登录即可。

如果您想拥有管理员权限,但仍希望选中验证规则,则只需使用&#34; special&#34;始终满足读/写规则的帐户。我在前一段时间偶然发现了这个问题,有两种基本方法可以解决,我在question中解释过(显然同样安全,因为这是我当时的问题):

  1. 使用databaseAuthVariableOverride设置一些特殊的auth属性,该属性在根.read / .write规则中进行检查,并且对于服务帐户仅为
  2. 创建一个特殊帐户(甚至是普通的电子邮件/密码),并使用相同的规则(root {&lt; {1}} / .read)对其uid,电子邮件或其他媒体资源进行硬编码。