【问题标题】:I want to delete selected user on Firebase Auth我想删除 Firebase Auth 上的选定用户
【发布时间】:2019-12-06 18:49:31
【问题描述】:

我想在 Firebase Auth 上删除选定的用户。

现在,我可以通过数据库删除当前选中用户的数据了。但我也想从 Auth 部分删除用户。我可以在使用适配器之前执行此操作。但是在使用适配器时我不能这样做。

我的管理面板适配器:

package com.example.yagoozonfirebasejava;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import java.util.List;

public class AdminPanelAdapter extends RecyclerView.Adapter<AdminPanelAdapter.CardDesingHolder> {

    private Context mContext;
    private List<Users> usersList;
    private DatabaseReference myRef;



    // Constructor
    public AdminPanelAdapter(Context mContext, List<Users> kisilerListe, DatabaseReference myRef) {
        this.mContext = mContext;
        this.usersList = kisilerListe;
        this.myRef = myRef;
    }
    // Holder class
    public class CardDesingHolder extends RecyclerView.ViewHolder {

        private TextView usernameAdmin;
        private TextView user_surnameAdminAdapter;
        private TextView user_emailAdminAdapter;
        private TextView user_RealnameeAdminAdapter;
        private TextView userUuidAdmin;
        private ImageView deleteUserAdmin;
        private FirebaseAuth mAuthAmdin;

        public CardDesingHolder(View itemView) {
            super(itemView);
            usernameAdmin = itemView.findViewById(R.id.username_AdminCard);
            user_RealnameeAdminAdapter = itemView.findViewById(R.id.userRealNameAdminCard);
            user_surnameAdminAdapter = itemView.findViewById(R.id.userSurnameAdminCard);
            user_emailAdminAdapter = itemView.findViewById(R.id.userEmail_AdminCard);
            userUuidAdmin = itemView.findViewById(R.id.userUuidAdmin);
            deleteUserAdmin = itemView.findViewById(R.id.imageViewDeleteUser);
        }
    }

    @Override
    public CardDesingHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.admin_usercard, viewGroup, false);
        return new CardDesingHolder(view);
    }

    @Override
    public void onBindViewHolder(final CardDesingHolder cardDesingHolder, int position) {
        final Users user = usersList.get(position);

        cardDesingHolder.user_emailAdminAdapter.setText("Mail : " + user.getUser_email());
        cardDesingHolder.user_surnameAdminAdapter.setText("Surname : " + user.getUser_surname());
        cardDesingHolder.user_RealnameeAdminAdapter.setText("Name : " + user.getUser_name());
        cardDesingHolder.usernameAdmin.setText("Username : " + user.getUser_username());
        cardDesingHolder.userUuidAdmin.setText("User UUID : " + user.getUser_id());

        // User Delete
        cardDesingHolder.deleteUserAdmin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final AlertDialog.Builder alert = new AlertDialog.Builder(mContext);

                alert.setTitle("Alert!");
                alert.setMessage("Are you sure??");

                alert.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(final DialogInterface dialog, int which) {
                        // Delete User value's on Database
                        myRef.child(user.getUser_id()).removeValue().addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(Task<Void> task) {
                                if(task.isSuccessful()) {
                                    Toast.makeText(mContext, "User Successfully Deleted!", Toast.LENGTH_SHORT).show();
                                    dialog.dismiss();
                                }
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(Exception e) {
                                Toast.makeText(mContext, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
                                dialog.dismiss();
                            }
                        });
                    }
                });

                alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });

                alert.create().show();
            }
        });
    }


    @Override
    public int getItemCount() {
        return usersList.size();
    }
}

我的管理面板类:

package com.example.yagoozonfirebasejava;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.media.Image;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;

import static android.view.View.TEXT_ALIGNMENT_CENTER;

public class AdminPanel extends AppCompatActivity {

    private Toolbar toolbarAdmin;
    private RecyclerView recyclerViewAdminPanel;
    private ArrayList<Users> usersArrayList;
    private AdminPanelAdapter adapter;
    private FirebaseDatabase database;
    private DatabaseReference myRef;
    private FirebaseAuth mAuthAdmin;
    private Button btn_menu;

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_admin_panel);
        /*
        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        if (user != null) {
            // User is signed in
            Intent intent = new Intent(AdminPanel.this, ProfilePage.class);
            startActivity(intent);
            finish();

        } else {
            // No user is signed in
            Intent intent = new Intent(AdminPanel.this, MainActivity.class);
            startActivity(intent);
            finish();
        }*/


        // Firebase Auth
        mAuthAdmin = FirebaseAuth.getInstance();


        // Toolbar Settings //
        toolbarAdmin = findViewById(R.id.toolbarAdmin);
        toolbarAdmin.setTitle("Yagoozon - Admin Panel");
        toolbarAdmin.setSubtitle("Welcome Admin");
        // Menu
        toolbarAdmin.inflateMenu(R.menu.logout_menu);
        toolbarAdmin.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                String mesaj = "";
                switch (item.getItemId()) {
                    case R.id.logout_menuid:
                        mAuthAdmin.signOut();
                        Intent out = new Intent(AdminPanel.this, MainActivity.class);
                        startActivity(out);
                        finish();
                        mesaj = "User Sign out!";
                        break;
                }
                Toast.makeText(AdminPanel.this, mesaj, Toast.LENGTH_LONG).show();
                return true;
            }
        });
        // Toolbar Settings End  //

        // Menu Button //
        btn_menu = findViewById(R.id.btn_filterAdminPanel);
        btn_menu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                PopupMenu popupMenu = new PopupMenu(AdminPanel.this, btn_menu);
                popupMenu.getMenuInflater().inflate(R.menu.filter_menu, popupMenu.getMenu());


                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        switch (item.getItemId()) {
                            case R.id.filterDate:
                                Query query = FirebaseDatabase.getInstance().getReference("Users")
                                        .orderByChild("user_email")
                                        .equalTo(mAuthAdmin.getCurrentUser().getEmail());

                                query.addValueEventListener(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(DataSnapshot dataSnapshot) {
                                        usersArrayList.clear();

                                        for (DataSnapshot d : dataSnapshot.getChildren()) {
                                            Users user = d.getValue(Users.class);
                                            user.setUser_id(d.getKey());

                                            usersArrayList.add(user);

                                        }

                                        adapter.notifyDataSetChanged();

                                    }

                                    @Override
                                    public void onCancelled(@NonNull DatabaseError databaseError) {

                                    }
                                });

                            return true;

                            case R.id.filterUuid:
                                Query queryUuid = FirebaseDatabase.getInstance().getReference("Users")
                                        .orderByChild("user_id")
                                        .equalTo(mAuthAdmin.getCurrentUser().getUid());

                                queryUuid.addValueEventListener(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(DataSnapshot dataSnapshot) {
                                        usersArrayList.clear();

                                        for (DataSnapshot d : dataSnapshot.getChildren()) {
                                            Users user = d.getValue(Users.class);
                                            user.setUser_id(d.getKey());

                                            usersArrayList.add(user);

                                        }

                                        adapter.notifyDataSetChanged();

                                    }

                                    @Override
                                    public void onCancelled(@NonNull DatabaseError databaseError) {

                                    }
                                });
                                return true;

                            case R.id.filterDefault:
                                myRef.addValueEventListener(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(DataSnapshot dataSnapshot) {

                                        usersArrayList.clear();

                                        for (DataSnapshot d : dataSnapshot.getChildren()) {
                                            Users user = d.getValue(Users.class);
                                            user.setUser_id(d.getKey());

                                            usersArrayList.add(user);

                                        }

                                        adapter.notifyDataSetChanged();

                                    }

                                    @Override
                                    public void onCancelled(@NonNull DatabaseError databaseError) {

                                    }
                                });
                                return true;
                            default:
                                return false;

                        }
                    }
                });
                popupMenu.show();
            }
        });


        // Menu Button End //

        // Definitions
        recyclerViewAdminPanel = findViewById(R.id.recyclerViewAdminPanel);

        // Firebase Database Connection
        database = FirebaseDatabase.getInstance();
        myRef = database.getReference("Users");


        // Recycler View
        recyclerViewAdminPanel.setHasFixedSize(true);
        recyclerViewAdminPanel.setLayoutManager(new LinearLayoutManager(this));

        // Create Array List
        usersArrayList = new ArrayList<>();

        // Recycler View Adapter
        adapter = new AdminPanelAdapter(AdminPanel.this, usersArrayList, myRef);
        recyclerViewAdminPanel.setAdapter(adapter);

        getUsersAdmin();

    }

    // Get Users Method
    public void getUsersAdmin() {

        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                usersArrayList.clear();

                for (DataSnapshot d : dataSnapshot.getChildren()) {
                    Users user = d.getValue(Users.class);
                    user.setUser_id(d.getKey());

                    usersArrayList.add(user);

                }

                adapter.notifyDataSetChanged();

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

    // Back Button
    @Override
    public void onBackPressed() {
        super.onBackPressed();
        finishAffinity(); // or finish();
    }
}

我的应用删除屏幕截图:

点击下方的垃圾桶图标,您要删除该图标。从数据库中删除该用户。但它不会在 Auth 上删除。

我尝试了几种不同的方法,但我做不到。我想从数据库中删除选定的用户数据,同时从 Auth 中删除。

【问题讨论】:

  • 这段代码有什么问题?
  • 我猜你没看我写的或者我写不出来。此代码仅从数据库中删除用户数据。我想从身份验证部分删除用户。
  • 您不能从客户端代码中删除任意用户。那将是一个安全漏洞。您需要编写后端代码以使用 Firebase Admin SDK 删除任何用户。
  • @DougStevenson 通常我可以用一行代码直接擦除。但我使用适配器和支架。我无法使用某种适配器将其删除。
  • 这与适配器或支架无关。您只是无法使用客户端代码删除任何 Firebase 身份验证用户帐户。

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


【解决方案1】:

以下代码适用于我删除用户帐户。

对于 Facebook

final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        try {
            AuthCredential credential = FacebookAuthProvider.getCredential(FirebaseAuth.getInstance().getCurrentUser().getProviderId());
            if (user != null) {
                user.reauthenticate(credential).addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                user.delete().addOnCompleteListener(new OnCompleteListener<Void>() {
                                            @Override
                                            public void onComplete(@NonNull Task<Void> task) {
                                                if (task.isSuccessful()) {
                                                    Log.d("Tag", "User account deleted.");
                                                    fbLogut();
                                                }
                                            }
                                        });

                            }
                        });
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }

谷歌

try {
            AuthCredential credentialg = GoogleAuthProvider.getCredential(FirebaseAuth.getInstance().getCurrentUser().getUid(), null);
            // Prompt the user to re-provide their sign-in credentials
            if (user != null) {
                user.reauthenticate(credentialg)
                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                user.delete()
                                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                                            @Override
                                            public void onComplete(@NonNull Task<Void> task) {
                                                if (task.isSuccessful()) {
                                                    Log.d("Tag", "User account deleted.");
                                                    googleSignout();
                                                }
                                            }
                                        });

                            }
                        });
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

对于电子邮件验证:

AuthCredential credential = EmailAuthProvider
                    .getCredential(em, password);
            if (user != null) {
                user.reauthenticate(credential).addOnCompleteListener(task -> user.delete().addOnCompleteListener(task1 -> {
                                    if (task1.isSuccessful()) {
                                        Log.d("Tag", "User account deleted.");
                                    }
                                }));
            }

或者(如果你是管理员)

FirebaseAuth.getInstance().deleteUser(uid);

【讨论】:

  • 从哪里获得 em 和密码变量以及在哪里定义它们?我得到一个重新验证和删除部分的错误。
  • em 和密码是用户的电子邮件和密码。如果这没有帮助,请检查我编辑的答案。
  • 我现在买了 em 和密码。但是我得到一个重新验证和删除部分的错误。您编辑的答案中的解决方案就是这样一个错误。 :prntscr.com/oli794
  • 您必须在项目中安装管理 SDK。在 Gradle 中添加实现 'com.google.firebase:firebase-admin:6.9.0'。文档:firebase.google.com/docs/admin/setup
  • 我还是想不通。
猜你喜欢
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 2022-01-21
  • 2021-08-08
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 2021-02-26
相关资源
最近更新 更多