Javascript Firebase实时数据库规则在前端不起作用
特定TLDR:ruleJavascript Firebase实时数据库规则在前端不起作用,javascript,firebase,firebase-realtime-database,firebase-security,Javascript,Firebase,Firebase Realtime Database,Firebase Security,特定TLDR:rule”.read:“auth!=null&&data.child('userEmail').val()==root.child('users').child(auth.uid.).child('email').val()”应能在应用程序中正常工作 我遵循了文档和规则,测试工作正常,所以我认为这与我的认证方式有关,也许?我将提供以下信息,希望有人能尽快回答这个问题 实时数据库结构: "db-name": { "units": {
”.read:“auth!=null&&data.child('userEmail').val()==root.child('users').child(auth.uid.).child('email').val()”
应能在应用程序中正常工作
我遵循了文档和规则,测试工作正常,所以我认为这与我的认证方式有关,也许?我将提供以下信息,希望有人能尽快回答这个问题
实时数据库结构:
"db-name": {
"units": {
0: {
"serial": "002",
"userEmail": "s@gmail.com"
},
1: {
"serial": "001",
"userEmail": "r@gmail.com"
}
},
"users": {
"R6nlZ...": {
"email": "r@gmail.com"
},
"qwerty...": {
"email": "s@gmail.com"
}
}
}
规则对象:
{
"rules": {
// ".read": "now < 1604037600000", // 2020-10-30
// ".write": "now < 1604037600000", // 2020-10-30
"units": {
".indexOn": "userEmail",
"$key": {
".read": "auth != null && data.child('userEmail').val() === root.child('users').child(auth.uid).child('email').val()",
".write" : "auth != null && data.child('userEmail').val() === root.child('users').child(auth.uid).child('email').val()"
}
},
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}
当我将Firebase权限设置为我粘贴的规则中的上述权限时,用户r@gmail.com
看不到任何单位。如果我让读取权限完全打开(不是我想要的),则该用户可以看到他们的单元
对我来说,这毫无意义,因为我认为无论用户使用何种登录类型,Firebase在用户登录时都可以看到auth.uid
"$key": {
".read": "auth !== null && root.child('users').hasChild(auth.uid)",
".write" : "auth !== null && root.child('users').hasChild(auth.uid)"
}
这样写的话,用户集合中存在的任何用户都可以访问“单位”
或者,您可以使用该用户的uid进行收集,并将密钥与其访问的uid进行匹配您的规则不允许此查询:
firebase.database().ref().child('units').orderByChild('userEmail').equalTo(firebase.auth().currentUser.email);
要使此查询起作用,用户需要对/units
具有读取权限。由于您没有声明任何.read
关于/units
的规则,因此查询被拒绝
您似乎认为规则会过滤数据,只返回用户应该有权访问的数据,但这不是它们的工作方式。正如Firebase文档所述:
但是,为了安全地允许查询数据
在您的场景中,这看起来像:
{
"rules": {
"units": {
".read": "auth.uid != null &&
query.orderByChild == 'userEmail' &&
query.equalTo == auth.token.email"
...
现在您的查询将被允许,而对/users
的其他/更广泛的读取将被拒绝
{
"rules": {
"units": {
".read": "auth.uid != null &&
query.orderByChild == 'userEmail' &&
query.equalTo == auth.token.email"
...