【问题标题】:Rules to realtime database实时数据库规则
【发布时间】:2021-12-28 16:59:01
【问题描述】:

我使用 Firebase,确切地说是一个实时数据库,我不知道应该设置什么规则。我制定了这些规则:

{
  "rules": {
        ".read": "data.child('Users').child(auth.uid).exists()",
        ".write": true
  }
}

但是现在每个人都可以写作了。 当我设置这些时:

{
  "rules": {
        ".read": "data.child('Users').child(auth.uid).exists()",
        ".write": "auth != null"
  }
}

使用 Gmail 的用户无法登录,因为数据库中的记录不是在所有设备上创建的,而是在所有设备上创建的。当我在 OnePlus 上测试时,一切都很好,当我在三星上测试时,数据库中的记录没有创建。 这是我负责创建用户的代码:

fAuth.createUserWithEmailAndPassword(reg_email, reg_password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
    @Override
    public void onComplete(@NonNull Task<AuthResult> task) {
        if (task.isSuccessful()) {
        fAuth.getCurrentUser().sendEmailVerification().addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        userID = fAuth.getCurrentUser().getUid();
                        reg_user = new User(reg_email, sex, btn_text, 0, 0);
                        databaseReference.child(userID).setValue(reg_user);
                        Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
                        startActivity(intent);
                        finish();
                        FirebaseAuth.getInstance().signOut();
                    } else {
                        Toast.makeText(RegisterActivity.this, "Error " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                        progressBar.setVisibility(View.INVISIBLE);
                    }
                }
            });
        } else {
            Toast.makeText(RegisterActivity.this, "Error " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
            progressBar.setVisibility(View.INVISIBLE);
        }
    }
});

【问题讨论】:

    标签: java android firebase firebase-realtime-database firebase-security


    【解决方案1】:

    当您在内部回调中使用 fAuth.getCurrentUser() 时,可能尚未设置它。而是使用最外层任务中的用户来确定 UID。

    fAuth.createUserWithEmailAndPassword(reg_email, reg_password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> createTask) { // ? rename here
            if (task.isSuccessful()) {
            fAuth.getCurrentUser().sendEmailVerification().addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> verifyTask) {
                        if (task.isSuccessful()) {
                            userID = createTask.getResult().getUser().getUid(); // ? use here
                            reg_user = new User(reg_email, sex, btn_text, 0, 0);
                            databaseReference.child(userID).setValue(reg_user);
    

    【讨论】:

    • 不幸的是它不起作用,用户是在“身份验证”中创建的,但不是实时的
    • “它不起作用”真的很难帮助。我建议在每个onComplete 方法内的第一行设置断点并在调试器中运行代码。检查第二个createTask.getResult().getUser().getUid() 的值是多少。 add a completion listener to your setValue call 也可能有用,看看那里是否有任何错误。
    • 但是为什么这个问题出在三星而不是一加?这两个方法createTask.getResult().getUser().getUid()fAuth.getCurrentUser().getUid() 返回相同的值。
    猜你喜欢
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 2020-02-16
    相关资源
    最近更新 更多