尽管用户已通过身份验证,但无法从数据库中删除数据?
Unable to delete data from database although the user is authenticated?
我真的被这个问题困住了 problem.I 我正在尝试从实时数据库 firebase 中删除一些用户。我正在使用 Firebase 提供的 email/password 身份验证。重新验证用户身份后,我尝试从数据库中删除数据。我收到来自 firebase 的权限被拒绝错误(com.google.firebase.database.DatabaseException:Firebase 数据库错误:权限被拒绝)。为什么?
这是我的代码:
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 class:
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());
}
}
});
}}
Firebase 规则:
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
在调试模式下,一切正常,而且,当我将数据库规则切换到 public 时,数据从数据库中删除。
您在请求删除用户数据后似乎正在删除用户帐户:
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());
}
}
});
}
我真的被这个问题困住了 problem.I 我正在尝试从实时数据库 firebase 中删除一些用户。我正在使用 Firebase 提供的 email/password 身份验证。重新验证用户身份后,我尝试从数据库中删除数据。我收到来自 firebase 的权限被拒绝错误(com.google.firebase.database.DatabaseException:Firebase 数据库错误:权限被拒绝)。为什么?
这是我的代码:
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 class:
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());
}
}
});
}}
Firebase 规则:
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
在调试模式下,一切正常,而且,当我将数据库规则切换到 public 时,数据从数据库中删除。
您在请求删除用户数据后似乎正在删除用户帐户:
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());
}
}
});
}