无法在 Firebase 实时数据库中使用通配符

问题描述 投票:0回答:1

我在实时数据库中的规则配置方面遇到问题。 在实时数据库中,我有:

"users": {
    "0ayi220wJ0WOHfPftAwaxAAJh3P2": {
      "email": "[email protected]",
      "emailVerified": false,
      "publicKey": "",
      "privateKey": "",
      }
    }

“0ayi220wJ0WOHfPftAwaxAAJh3P2”是 uid。
我正在尝试在 React Native 中开发一个聊天应用程序,这是列出数据库中所有用户的代码:

onValue(firebaseDatabaseRef(firebaseDatabase, 'users'), async (snapshot) => {
            if (snapshot.exists()) {
                let stringUser = await AsyncStorage.getItem('user')     
                let myUserId = JSON.parse(stringUser)['uid']
                let snapShotObject = snapshot.val()
                // console.log(snapShotObject)
                setUsers(Object.keys(snapShotObject).filter((eachKey) => eachKey != myUserId)
                    .map((eachKey: any) => {
                    let eachObject = snapShotObject[eachKey]
                    return {
                        name: eachObject['email'],
                        email: eachObject['email'],
                        userId: eachKey,
                    }
                }))
            }
            else {
                console.log('No data availble')
            }

因此,应用程序将从每个 uid 获取电子邮件和 emailVerified,除了我的 uid(我从身份验证中获得)

当我配置如下规则时,应用程序可以从每个 uid 获取所有数据

  {
  "rules": {
    "users": {
      ".read": true,
      }
    }
  }

但是当我使用通配符“$uid”配置规则时,我的应用程序无法再从数据库获取数据(权限被拒绝)

  {
  "rules": {
    "users": {
      "$uid": {
        ".read": true       
        }
      }
    }
  }

如何使用通配符?我需要用它来授权谁可以获得私钥。

javascript firebase-realtime-database firebase-security
1个回答
0
投票

您的代码尝试从数据库读取此数据:

onValue(firebaseDatabaseRef(firebaseDatabase, 'users')

由于您的安全规则未授予任何人对

/users
的读取访问权限,因此该操作被拒绝。

您似乎错过了有关“安全规则不会过滤数据”这一事实的文档。他们实际上并不查看数据,而是“只是”确保代码仅尝试访问允许访问的数据。 您需要找到一种方法来仅读取或查询用户有权访问的数据。例如,要仅读取用户自己的UID,您可以读取:

let uid = getAuth().currentUser.uid; onValue(firebaseDatabaseRef(firebaseDatabase, 'users', uid), ...

在其他情况下,您需要 
使用查询,然后保护它

在另一组情况下,您无法使用查询来满足安全约束,而必须更改数据模型以允许用例。

© www.soinside.com 2019 - 2024. All rights reserved.