如何将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
相关产品推荐
相关产品推荐

