Firebase实时数据库规则禁止从经过身份验证的用户写入

时间:2017-04-23 19:12:12

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

我遇到了Firebase实时数据库规则的问题。我使用mAuth.createUserWithEmailAndPassword(email, password)注册了一个新用户。在onCompleteMethod我想在实时数据库中添加我自己的用户对象。 我这样做,因为每个用户都有电子邮件/密码的附加信息。

我检查后

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"时,此代码才有效。

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

感谢您的帮助!

修改

@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();

    }
}

1 个答案:

答案 0 :(得分:1)

数据库写入不会同步完成。在数据库操作有时间完成之前,您需要注销:

     //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日志语句,以检测登录/注销何时完成。这些日志应确认在DB写入之前注销已完成。