0

我遇到了Firebase实时数据库规则的问题。我注册了一个新用户mAuth.createUserWithEmailAndPassword(email, password)。在onCompleteMethod我想在实时数据库中添加我自己的用户对象。 我正在这样做,因为每个用户都有额外的电子邮件/密码信息。Firebase实时数据库规则不允许通过身份验证的用户写入

后我检查

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不为空 - 他登录并在火力地堡

{ 
    "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(); 

    } 
} 
+0

你能更新你的文章以包含你的'onComplete()'方法的主体吗?这将更清楚执行'createNewUser()'的路径。 –

+0

我添加了onComplete方法。我希望它有帮助! – Hnig

回答

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(),你可以用一个日志语句添加CompletionListenersetValue()调用看到写操作完成时。您还可以添加一个AuthStateListener以及日志语句来检测登录/注销完成的时间。那些日志应该确认注销在数据库写入之前完成。

相关问题