如果字符串与属性匹配,则 Firebase 实时数据库允许 read/write

Firebase Realtime Database Allow read/write if string matches an attribute

我的 firebase 实时数据库结构:

stores
   -store1234
      -data
      -specialKeyForStore1234
   -store4567
      -data
      -specialKeyForStore4567
   -...

我的目标:

-数据 应该public 每个人都可读,但只有拥有数据的商店才能 add/edit/remove 数据

现在我的webapp中不需要登录认证访问数据库,但是为了限制其他人更改其他商店的数据,我想实现这样的东西:

如果store1234想要write/edit自己的data,需要提供这个specialKeyForStore1234.

store1234的实际webapp有这个特殊的key,可以和数据库中的value进行比较匹配,如果匹配,则允许读写.否则拒绝。

如何做到?

要发送特殊密钥,请向模型添加一个字段 specialKey

基本上,检查 model-key specialKey 是否等于 database-field specialKey

这种方法的明显问题是,模型的 specialKey 然后会与每个对象保持一致,下面也有一个建议。

注:newData为传入model-data.

下面的代码可能指向正确的方向。我没有测试它,可能做出了错误的假设。

规则

{
  "rules": {
     "shops": {
       "$shop_id" {
            "payload" {
                ".read":  if true,

                 // OPTION A                 

                ".write": "root.child(shops).child($shop_id)
                  .child(newData.child('specialKey)).exists()"
                
                // OPTION B
                // 
                // Try deleting the secrectKet in the model.
                // No idea if this works in real life.
                // === seems to be correct for assigning values?
                
                ".write": "root.child(shops).child($shop_id)
                  .child(newData.child('specialKey)).exists() 
                  && newData.child('specialKey).val() === '' "
                
            },
            "specialKey" {
                // is READ:false ok to be processed by rule above?
                ".read":  if false, 
                ".write": if false,
            }
        }
     }
  }
}

数据结构

{
    "shops": {
        "shop-a": {
            "payload": "yourPayload",
            "SuperSecretSpecialKey123": true
       }
    }
}

来源

https://firebase.google.com/docs/rules/rules-language#building_conditions

底线

可能值得考虑一个正常的身份验证过程,然后可以分配用户 write-roles 和用户正确的身份验证。