【问题标题】:Make Firebase realtime database returning only allowed fields使 Firebase 实时数据库仅返回允许的字段
【发布时间】:2019-01-31 11:19:37
【问题描述】:

我有以下数据库结构

{
"users": {
   "$uid": {
     "externalId": "val",
     "email": "mail@example.com",
     "items": {
       "$itemId": {
       }
     }
   }
 }
}

我需要允许任何经过身份验证的用户在通过externalId 查询该用户的节点时读取任何用户的items,但不允许读取email 字段

这是此查询的代码

val reference = FirebaseDatabase.getInstance().getReference("users")
val query = reference.orderByChild("externalId").equalTo(extId)
query.addListenerForSingleValueEvent(object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        val list = mutableListOf<Item>()
        if (dataSnapshot.exists()) {
            for (user in dataSnapshot.children) {
                for (itemSnapshot in user.child("items").children) {
                    val item = itemSnapshot.getValue(Item::class.java)
                    item?.let {
                        list.add(item)
                    }
                }
            }
        }
        result.value = list
    }
    override fun onCancelled(databaseError: DatabaseError) {
    }
})

这是数据库规则

{
    "users": {
       ".indexOn": "externalId",
       ".read": "auth !== null && query.orderByChild == 'externalId' && query.equalTo !== null"
       "$uid": {
         ".write": "$uid === auth.uid"
       }
     }
}

但这允许读取完整的$uid 节点,包括email。如何配置规则以使数据库返回$uid 节点而没有email 字段?

【问题讨论】:

  • 我会拆分 user_data 和 items 节点,因此您可以为它们设置不同的规则。同样对我来说结构似乎不正确,理想情况下这些是单独的“表格”

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


【解决方案1】:

根据我的评论,我认为您的问题的解决方案是考虑不同的数据结构

{
"users": {
   "$uid": {
     "email": "mail@example.com",
           }
         }
"items": {
    "$uid":{
     "externalId": "val",
     "$itemId": {
           }
}

您可以将用户节点上的读取设置为"$uid === auth.uid",并在项目上设置为true

【讨论】:

    猜你喜欢
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 2019-05-15
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多