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

如何将Firebase实时数据库与已认证用户建立关联?

嘿,这个场景我熟,咱们一步步把数据和用户关联起来,实现每个用户只看自己的工单就行~

步骤1:存储工单时带上当前用户的UID

首先,你需要在创建维护工单的时候,把当前登录用户的唯一标识(也就是Firebase Auth里的UID)和工单数据一起存到数据库里。有两种常用的结构方案:

方案A:给工单添加userId字段

在你的MaintenanceActivity里,当准备提交工单数据时,先获取当前登录用户的UID,然后把它作为一个字段加入到工单的Map中:

// 获取当前登录用户
FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
if (currentUser != null) {
    String userId = currentUser.getUid();
    
    // 构建工单数据
    Map<String, Object> ticket = new HashMap<>();
    ticket.put("title", "设备故障");
    ticket.put("description", "打印机卡纸");
    ticket.put("userId", userId); // 关键:加入用户ID
    
    // 写入数据库
    FirebaseDatabase.getInstance().getReference("maintenanceTickets")
        .push()
        .setValue(ticket)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void unused) {
                // 提交成功逻辑
            }
        });
}

方案B:按用户UID划分数据库节点

另一种更清晰的结构是直接把每个用户的工单放到以其UID命名的节点下,比如/users/{userId}/maintenanceTickets:

FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
if (currentUser != null) {
    String userId = currentUser.getUid();
    Map<String, Object> ticket = new HashMap<>();
    ticket.put("title", "设备故障");
    ticket.put("description", "打印机卡纸");
    
    // 写入到当前用户专属的节点下
    FirebaseDatabase.getInstance().getReference("users")
        .child(userId)
        .child("maintenanceTickets")
        .push()
        .setValue(ticket);
}

这种结构的好处是天然隔离了用户数据,后续查询更直接。

步骤2:查询数据时只加载当前用户的工单

接下来,当用户登录后,你需要确保只获取属于他自己的工单,对应上面两种方案:

对应方案A的查询方式

使用Query来过滤出userId等于当前用户UID的工单:

FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
if (currentUser != null) {
    String userId = currentUser.getUid();
    DatabaseReference ticketsRef = FirebaseDatabase.getInstance().getReference("maintenanceTickets");
    Query userTicketsQuery = ticketsRef.orderByChild("userId").equalTo(userId);
    
    userTicketsQuery.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // 遍历dataSnapshot,只处理当前用户的工单
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                // 解析工单数据并展示
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            // 处理错误
        }
    });
}

对应方案B的查询方式

直接访问当前用户专属的节点,不需要额外过滤:

FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
if (currentUser != null) {
    String userId = currentUser.getUid();
    DatabaseReference userTicketsRef = FirebaseDatabase.getInstance().getReference("users")
        .child(userId)
        .child("maintenanceTickets");
    
    userTicketsRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // 遍历并展示当前用户的工单
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            // 处理错误
        }
    });
}
步骤3:配置Firebase安全规则(必做!)

最后一定要配置安全规则,防止用户访问不属于自己的数据。根据你的结构选择对应的规则:

对应方案A的安全规则

{
  "rules": {
    "maintenanceTickets": {
      ".read": "auth != null && query.orderByChild == 'userId' && query.equalTo == auth.uid",
      ".write": "auth != null && newData.child('userId').val() == auth.uid"
    }
  }
}

对应方案B的安全规则

{
  "rules": {
    "users": {
      "$uid": {
        "maintenanceTickets": {
          ".read": "auth != null && auth.uid == $uid",
          ".write": "auth != null && auth.uid == $uid"
        }
      }
    }
  }
}

这个规则确保只有登录用户才能读写自己的工单数据,避免数据泄露。

这样改完之后,每个用户登录后就只能看到自己创建的维护工单啦,完美解决数据隔离的问题~

内容的提问来源于stack exchange,提问作者Face Value

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:18:12