0

정말이 문제가 붙어 있습니다. 나는 realtimedatabase firebase에서 일부 사용자를 삭제하려고합니다. Firebase에서 제공하는 이메일/비밀번호 인증을 사용하고 있습니다. 내가 사용자를 다시 인증하면 DB에서 데이터를 삭제하려고합니다. firebase에서 오류가 거부되었습니다 (com.google.firebase.database.DatabaseException : Firebase 데이터베이스 오류 : 사용 권한이 거부되었습니다). 왜? 디버그 모드에서사용자가 인증되었지만 데이터베이스에서 데이터를 삭제할 수 없습니까?

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

이 모두는 잘 작동하고 :

public class DBHelper { 

private static DBHelper instance = null; 
private FirebaseDatabase database; 
private DatabaseReference ref; 

private DBHelper() { 
    database = FirebaseDatabase.getInstance(); 
} 

public static DBHelper getInstance() { 
    if (instance == null) 
     instance = new DBHelper(); 

    return instance; 
} 

public void saveUserOnDB(String userId, String name, String email) { 
    ref = database.getReference().child("users"); 
    ref.child(userId).setValue(new User(name, email)); 
} 

public void deleteUser(String userId) { 
    ref = database.getReference().child("users"); 
    ref.child(userId).removeValue().addOnCompleteListener(new OnCompleteListener<Void>() { 
     @Override 
     public void onComplete(@NonNull Task<Void> task) { 
      if(!task.isSuccessful()){ 
       Log.e("TAG","onComplete",task.getException()); 
      } 
     } 
    }); 
}} 

중포 기지 규칙 :

public void reAuthenticateUser(String password) { 
    final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
    AuthCredential credential = EmailAuthProvider 
      .getCredential(user.getEmail(), password); 
    user.reauthenticate(credential) 
      .addOnCompleteListener(new OnCompleteListener<Void>() { 
       @Override 
       public void onComplete(@NonNull Task<Void> task) { 
        if (!task.isSuccessful()) { 
         handleExceptions(task.getException()); 
        } else { 
         dialog.dismiss(); 

         DBHelper.getInstance().deleteUser(user.getUid());//the problem is here 

         deleteUserAccount(); 
        } 
       } 
      }); 

} 

가 여기 내 DBHelper 클래스입니다 :

여기 내 코드입니다 데이터베이스 규칙을 공용으로 전환하면 데이터가 db에서 삭제됩니다.

답변

0

당신이 사용자의 데이터 삭제를 요청 후 사용자의 계정을 삭제하는 것으로 나타납니다

DBHelper.getInstance().deleteUser(user.getUid()); 

deleteUserAccount(); // <== does this call FirebaseUser.delete()? 

, 당신은 아마 계정 삭제는 비동기 데이터 전에 영향을 복용하는 경쟁 조건을 만드는 그렇다면 삭제가 완료되었습니다. deleteUserAccount()으로 전화를 이동하여 데이터 삭제 완료 청취자로 이동하십시오.

public void deleteUser(String userId) { 
    ref = database.getReference().child("users"); 
    ref.child(userId).removeValue().addOnCompleteListener(new OnCompleteListener<Void>() { 
     @Override 
     public void onComplete(@NonNull Task<Void> task) { 
      if(task.isSuccessful()){ 
       deleteUserAccount(); // <== MOVE HERE 
      } else { 
       Log.e("TAG","onComplete",task.getException()); 
      } 
     } 
    }); 
} 
+0

감사합니다. 지금 작동합니다 : D – Gabriela

관련 문제