Skip to main content
 首页 » 编程设计

android之身份验证后读取数据时 Firebase 权限被拒绝

2024年02月24日16jyk

我是 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 文档以及之前的问题和解答:

最简单的解决方案是允许读取 users 节点:

{ 
    "rules": { 
        "users": { 
            ".read": "auth !== null && auth.provider === 'password'" 
        } 
    } 
} 

然后在该级别上查询:

getData(ref.child("users"));