我想阻止添加时间戳早于现有数据的数据。样本数据库:
{
"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);
为什么这样工作?它没有任何意义。
答案 0 :(得分:3)
当您使用firebase作为管理员或服务帐户时,不会检查验证规则 - 因为,您是管理员:)
如果您只是想要正常访问数据库,则只需以普通帐户登录即可。
如果您想拥有管理员权限,但仍希望选中验证规则,则只需使用&#34; special&#34;始终满足读/写规则的帐户。我在前一段时间偶然发现了这个问题,有两种基本方法可以解决,我在question中解释过(显然同样安全,因为这是我当时的问题):
.read
/ .write
规则中进行检查,并且对于服务帐户仅为 。 .read
)对其uid,电子邮件或其他媒体资源进行硬编码。