【问题标题】:Firebase Database security rules works in simulator, not in the java codeFirebase 数据库安全规则适用于模拟器,而不适用于 java 代码
【发布时间】:2017-01-22 23:26:30
【问题描述】:

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

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

Firebase 安全规则:

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

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

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

应该拒绝的样本数据:

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

Admin Database API 部分所述,我将com.google.firebase:firebase-admin:4.0.3 与纯Java 结合使用。

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);

为什么会这样?这没有任何意义。

【问题讨论】:

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


    【解决方案1】:

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

    如果您只想正常访问数据库,您可以使用普通帐户登录。

    如果您想拥有管理员权限,但仍希望检查验证规则,您只需使用始终满足读/写规则的“特殊”帐户。前段时间我也偶然发现了这一点,有两种基本方法可以做到这一点,在我的question 中进行了解释(显然同样安全,因为这是我当时的问题):

    1. 使用databaseAuthVariableOverride 设置一些特殊的身份验证属性,该属性已在根.read/.write 规则中检查,并且服务帐户为true。
    2. 创建一个特殊帐户(即使是普通的电子邮件/密码),并在相同的规则中硬编码其 uid、电子邮件或其他属性(root 的 .read/.write)。

    【讨论】:

    • 谢谢!我在这上面花了太多时间;-)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    相关资源
    最近更新 更多