Firebase 安全权限
Firebase Security Permissions
我遇到了试图访问其他人电子邮件的用户的问题。我得到 E/ContactsFragment.java: Finding email failed. DatabaseError: Permission denied
。还值得注意的是,电子邮件在进入数据库之前会经过检查,而且我输入的电子邮件与数据库中的电子邮件相同。
基本上,我要做的是让 user1
找到 user2
的电子邮件。从那里,我将对电子邮件进行一些处理。
{
"rules": {
"users":{
".indexOn": ["email"],
"$uid":{
".read": "auth !== null",
"email":{
".write": "auth !== null && $uid === auth.uid",
".validate": "newData.isString()"
}
}
}
}
}
这是我的数据结构:
这是我尝试访问电子邮件的代码:
final String TAG = "ContactsFragment.java";
FirebaseDatabase.getInstance().getReference().child("users").orderByChild("email").equalTo(email).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// some code
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.e(TAG,"Finding email failed. " + databaseError);
}
});
我该如何解决?我错过了什么重要的东西吗?
目前,您的规则只授予 /users
节点下的子节点读取权限,而不是 /users
节点本身,这将拒绝他们查询列表。
如果您将 .read
规则移到 $uid
子项之外,它将允许用户查询 /users
列表节点:
{
"rules": {
"users":{
".indexOn": ["email"],
".read": "auth !== null",
"$uid":{
"email":{
".write": "auth !== null && $uid === auth.uid",
".validate": "newData.isString()"
}
}
}
}
}
查询附加到列表节点而不是列表下的子节点,因此需要在列表本身上授予 .read
权限。例如,您的查询附加到 /users
节点:
FirebaseDatabase.getInstance().getReference().child("users").orderByChild("email").equalTo(email)[...]
这是因为 rules are applied in an atomic manner,因此深路径的 .read
规则将不允许访问较浅的路径。
我遇到了试图访问其他人电子邮件的用户的问题。我得到 E/ContactsFragment.java: Finding email failed. DatabaseError: Permission denied
。还值得注意的是,电子邮件在进入数据库之前会经过检查,而且我输入的电子邮件与数据库中的电子邮件相同。
基本上,我要做的是让 user1
找到 user2
的电子邮件。从那里,我将对电子邮件进行一些处理。
{
"rules": {
"users":{
".indexOn": ["email"],
"$uid":{
".read": "auth !== null",
"email":{
".write": "auth !== null && $uid === auth.uid",
".validate": "newData.isString()"
}
}
}
}
}
这是我的数据结构:
这是我尝试访问电子邮件的代码:
final String TAG = "ContactsFragment.java";
FirebaseDatabase.getInstance().getReference().child("users").orderByChild("email").equalTo(email).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// some code
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.e(TAG,"Finding email failed. " + databaseError);
}
});
我该如何解决?我错过了什么重要的东西吗?
目前,您的规则只授予 /users
节点下的子节点读取权限,而不是 /users
节点本身,这将拒绝他们查询列表。
如果您将 .read
规则移到 $uid
子项之外,它将允许用户查询 /users
列表节点:
{
"rules": {
"users":{
".indexOn": ["email"],
".read": "auth !== null",
"$uid":{
"email":{
".write": "auth !== null && $uid === auth.uid",
".validate": "newData.isString()"
}
}
}
}
}
查询附加到列表节点而不是列表下的子节点,因此需要在列表本身上授予 .read
权限。例如,您的查询附加到 /users
节点:
FirebaseDatabase.getInstance().getReference().child("users").orderByChild("email").equalTo(email)[...]
这是因为 rules are applied in an atomic manner,因此深路径的 .read
规则将不允许访问较浅的路径。