我是 Firebase 新手。我使用电子邮件和密码对用户进行了身份验证 -
final Firebase ref = new Firebase("https://app.firebaseio.com");
ref.authWithPassword("app@firebaseio.com", "password", new Firebase.AuthResultHandler() {
@Override
public void onAuthenticated(AuthData authData) {
System.out.println("User ID: " + authData.getUid());
getData(ref);
}
@Override
public void onAuthenticationError(FirebaseError firebaseError) {
}
});
但是在身份验证后,当我读取数据时,我收到Permission Denied
。
private void getData(Query ref) {
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
System.out.println(snapshot.getValue());
}
@Override
public void onCancelled(FirebaseError firebaseError) {
System.out.println("The read failed: " + firebaseError.getMessage());
}
});
}
这些是 Firebase 规则。
{
"rules": {
"users": {
"$uid": {
".read": "auth !== null && auth.provider === 'password'"
}
}
}
}
请您参考如下方法:
Firebase 的权限模型仅允许用户访问您明确授予访问权限的数据。由于在您的安全规则中,您只授予对 /users/$uid
的访问权限,因此用户无法从 root /
读取。 Firebase 文档在 "rules cascade" 下对此进行了介绍。 .
您似乎想要使用安全规则来过滤数据,而这对于 Firebase 的安全模型来说是不可能的。请参阅"rules are not filters"部分Firebase 文档以及之前的问题和解答:
- firebase security permission not working
- firebase rules not working
- How to use Firebase rules to only give permission to certain leaf nodes
最简单的解决方案是允许读取 users
节点:
{
"rules": {
"users": {
".read": "auth !== null && auth.provider === 'password'"
}
}
}
然后在该级别上查询:
getData(ref.child("users"));