Firebase 实时数据库规则不允许经过身份验证的用户写入

Firebase Realtime Database rules are disallowing write from authenticated user

我对 Firebase 实时数据库规则有疑问。我用 mAuth.createUserWithEmailAndPassword(email, password) 注册了一个新用户。在 onCompleteMethod 中,我想在实时数据库中添加我自己的用户对象。 我这样做是因为每个用户都有 email/password.

的附加信息

我检查后

FirebaseUser fireUser = FirebaseAuth.getInstance().getCurrentUser();
if(fireUser == null) {
    //do something
} else {
    createNewUser(fireUser);
}

方法

private void createNewUser(FirebaseUser fireUser) {
        // Build the user-object.
        User user = new User();
        user.setUserId(fireUser.getUid());
        user.setUsername(name);
        user.setSex(sex);
        user.setEmail(email);
        user.setAge(time);
        user.setImageUri("");

        // Create database connection and reference.
        DatabaseReference mDatabaseRef = FirebaseDatabase.getInstance().getReference();
        mDatabaseRef.child("users").child(fireUser.getUid()).setValue(user);
    }

被调用。但由于某种原因,抛出了这个 DatabaseError:

W/RepoOperation: setValue at /users/9i6loj4BlCWkgkXOULWxbCSlvnx1 failed: DatabaseError: Permission denied

根据我的理解,如果 FirebaseUser 不为空 - 他已登录,因此我的规则在 Firebase 中声明

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

将允许用户写入数据库。但是,当我将规则更改为 ".read": "true"".write": "true".

时,此代码才有效

所以我的问题是:我在这里做错了什么?我只希望经过身份验证的用户 read/write.

感谢您的帮助!

编辑

@Override
 public void onComplete(@NonNull Task<AuthResult> task) {
     if (!task.isSuccessful()) {
         loadingPanel.setVisibility(View.GONE);
     } else {
         loadingPanel.setVisibility(View.GONE);
         FirebaseUser fireUser = FirebaseAuth.getInstance().getCurrentUser();
         if(fireUser == null) {
             Toast.makeText(getApplicationContext(), "User is null", Toast.LENGTH_SHORT).show();
         }

         // Send verification mail
         sendVerificationEmail(fireUser);

         // Create a new User!
         createNewUser(fireUser);

         //start intent and sign out.
         Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
         FirebaseAuth.getInstance().signOut();
         startActivity(intent);
         finish();

    }
}

数据库写入未同步完成。您要在数据库操作完成之前注销:

     //start intent and sign out.
     Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
     FirebaseAuth.getInstance().signOut();  // <== Can't do this here!
     startActivity(intent);
     finish();

createNewUser() 中,您可以将带有日志语句的 CompletionListener 添加到 setValue() 调用以查看写入何时完成。您还可以添加 AuthStateListener with log 语句来检测 sign-in/sign-outs 何时完成。这些日志应确认在数据库写入之前注销已完成。