You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Cloud Firestore中查询?认证后按邮箱判断管理员身份并跳转

关于Cloud Firestore查询及登录后管理员判断跳转的解决方案

一、Cloud Firestore基础查询操作步骤

Firestore的查询操作核心就是构建查询条件 + 监听结果返回,我给你梳理几个常用场景的实现方式(以Android环境为例,和你的代码环境匹配):

  1. 先初始化Firestore实例:
FirebaseFirestore db = FirebaseFirestore.getInstance();
  1. 查询集合下所有文档:
db.collection("users")
        .get()
        .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (QueryDocumentSnapshot document : task.getResult()) {
                        Log.d(TAG, document.getId() + " => " + document.getData());
                        // 逐个处理文档数据
                    }
                } else {
                    Log.d(TAG, "获取文档失败: ", task.getException());
                }
            }
        });
  1. 带条件的精准查询(比如匹配特定邮箱的用户):
db.collection("users")
        .whereEqualTo("email", "target@example.com")
        .get()
        .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    if (!task.getResult().isEmpty()) {
                        // 找到匹配的文档,处理数据
                    } else {
                        // 无匹配结果
                    }
                } else {
                    Log.d(TAG, "查询文档失败: ", task.getException());
                }
            }
        });

二、登录后判断管理员并跳转页面的实现方案

这个需求完全可行!结合你给出的登录代码,我们可以在登录成功后立即查询Firestore中的管理员标识(你可以选择两种存储方式:一是专门建admins集合存储管理员邮箱;二是在users集合的用户文档里加isAdmin布尔字段),再根据结果跳转对应页面。

以下是完善后的代码示例:

// 邮箱密码登录操作
mAuth.signInWithEmailAndPassword(email, password)
        .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    // 登录成功,获取当前用户邮箱
                    FirebaseUser currentUser = mAuth.getCurrentUser();
                    if (currentUser != null) {
                        String userEmail = currentUser.getEmail();
                        // 查询是否为管理员(这里假设用`admins`集合存储管理员邮箱)
                        FirebaseFirestore db = FirebaseFirestore.getInstance();
                        db.collection("admins")
                                .whereEqualTo("email", userEmail)
                                .get()
                                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                                    @Override
                                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                                        if (task.isSuccessful()) {
                                            if (!task.getResult().isEmpty()) {
                                                // 是管理员,跳转到管理员后台
                                                startActivity(new Intent(LoginActivity.this, AdminDashboard.class));
                                            } else {
                                                // 普通用户,跳转到用户主页
                                                startActivity(new Intent(LoginActivity.this, UserHome.class));
                                            }
                                            finish(); // 关闭当前登录页面
                                        } else {
                                            // 查询管理员状态失败,提示用户
                                            Toast.makeText(LoginActivity.this, "验证管理员身份失败: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                                        }
                                    }
                                });
                    }
                } else {
                    // 登录失败,提示错误信息
                    Toast.makeText(LoginActivity.this, "登录失败: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                }
            }
        });

补充说明:

如果是在users集合的用户文档里用isAdmin字段标记管理员,查询逻辑可以改成这样(用用户UID作为文档ID更安全):

db.collection("users")
        .document(currentUser.getUid())
        .get()
        .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if (task.isSuccessful()) {
                    DocumentSnapshot doc = task.getResult();
                    if (doc.exists() && doc.getBoolean("isAdmin") != null && doc.getBoolean("isAdmin")) {
                        // 是管理员,跳转管理员页面
                        startActivity(new Intent(LoginActivity.this, AdminDashboard.class));
                    } else {
                        // 普通用户,跳转用户主页
                        startActivity(new Intent(LoginActivity.this, UserHome.class));
                    }
                    finish();
                } else {
                    Toast.makeText(LoginActivity.this, "获取用户信息失败: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                }
            }
        });

注意:为了安全,管理员权限的判断最好配合Firebase安全规则,限制管理员页面数据的访问权限,避免客户端被篡改后越权。

内容的提问来源于stack exchange,提问作者Ashish Yadav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:22:27