【问题标题】:Unable to delete data from database although the user is authenticated?尽管用户已通过身份验证,但无法从数据库中删除数据?
【发布时间】:2017-10-12 20:58:51
【问题描述】:

我真的被这个问题困住了。我正在尝试从实时数据库 firebase 中删除一些用户。我正在使用 Firebase 提供的电子邮件/密码身份验证。重新验证用户身份后,我尝试从数据库中删除数据。我收到来自 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 类:

 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"
  }
}

在调试模式下,一切正常,而且,当我将数据库规则切换为公共时,数据将从 db 中删除。

【问题讨论】:

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


    【解决方案1】:

    在您请求删除用户数据后,您似乎正在删除该用户的帐户:

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

    【讨论】:

      猜你喜欢
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      • 2018-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多