我在实时数据库中的规则配置方面遇到问题。 在实时数据库中,我有:
"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
}
}
}
}
如何使用通配符?我需要用它来授权谁可以获得私钥。
您的代码尝试从数据库读取此数据:
onValue(firebaseDatabaseRef(firebaseDatabase, 'users')
由于您的安全规则未授予任何人对
/users
的读取访问权限,因此该操作被拒绝。
您似乎错过了有关“安全规则不会过滤数据”这一事实的文档。他们实际上并不查看数据,而是“只是”确保代码仅尝试访问允许访问的数据。 您需要找到一种方法来仅读取或查询用户有权访问的数据。例如,要仅读取用户自己的UID,您可以读取:
let uid = getAuth().currentUser.uid;
onValue(firebaseDatabaseRef(firebaseDatabase, 'users', uid), ...
在其他情况下,您需要使用查询,然后保护它
。 在另一组情况下,您无法使用查询来满足安全约束,而必须更改数据模型以允许用例。