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以及日誌語句來檢測登錄/註銷完成的時間。那些日誌應該確認註銷在數據庫寫入之前完成。

相關問題