验证后读取数据时,Firebase权限被拒绝

mjo*_*osh 4 android firebase firebase-security firebase-realtime-database

我是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) {
    }
});
Run Code Online (Sandbox Code Playgroud)

但在我阅读数据后进行身份验证后,我得到了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());
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

这些是Firebase规则.

{
    "rules": {
        "users": {
            "$uid": {
                ".read": "auth !== null && auth.provider === 'password'"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Fra*_*len 8

Firebase的权限模型仅允许用户访问您明确授予访问权限的数据.由于在您的安全规则中,您只提供访问权限/users/$uid,因此用户无法从root读取/.Firebase文档涵盖了"规则级联"下的内容.

您似乎希望使用安全规则来过滤数据,这是Firebase的安全模型无法实现的.请参阅Firebase文档中的"规则不是过滤器"部分以及之前的问题和答案:

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

{
    "rules": {
        "users": {
            ".read": "auth !== null && auth.provider === 'password'"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在该级别进行查询:

getData(ref.child("users"));
Run Code Online (Sandbox Code Playgroud)