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

Swift Firebase如何实现用户仅拉取自身uid对应的存储数据

问题修复方案

核心问题说明

你当前的代码存在两处核心逻辑错误,和你怀疑的let handDryLocations = ["id":key这段没有直接关系:

  • 所有用户的干手数据都直接存储在users根节点下,没有和当前登录用户的UID做绑定分层
  • 读取数据时直接监听整个users节点,自然会返回所有用户的全量数据

前置要求

确保你已经接入了Firebase Auth,用户进入当前页面前已经完成登录操作,只有登录后才能获取到用户唯一的uid用于数据隔离。

代码修改步骤

1. 修改数据读取逻辑(viewDidLoad部分)

将原来监听整个users节点的逻辑,改为仅监听当前登录用户专属的子节点:

override func viewDidLoad() {
    super.viewDidLoad()
    
    NotificationCenter.default.addObserver(self, selector: #selector(didGetNotification4(_:)), name: Notification.Name("text4"), object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(didGetNotification5(_:)), name: Notification.Name("text5"), object: nil)
    
    if FirebaseApp.app() == nil {
        FirebaseApp.configure()
    }

    // 新增:获取当前登录用户UID,未登录则做异常处理
    guard let currentUid = Auth.auth().currentUser?.uid else {
        // 此处可添加未登录跳转逻辑,比如弹出提示、跳转到登录页
        return
    }
    // 修改:数据库路径调整为当前用户专属的子节点
    refHandrylocations = Database.database().reference().child("users").child(currentUid).child("handDryLocations")
    
    refHandrylocations.observe(DataEventType.value, with:{(snapshot) in
        if snapshot.childrenCount>0{
            self.handDryList.removeAll()
            
            for handDryOptions in snapshot.children.allObjects as![DataSnapshot]{
                let handDryObject = handDryOptions.value as? [String: AnyObject]
                let handDryLocation = handDryObject?["handrylocation"]
                let handDryBest = handDryObject?["handdrybest"]
                let handDryString = handDryObject?["handdryoption"]
                let handDryId = handDryObject?["id"]
                
                let handDry = HandDryModel(id: handDryId as! String?, location: handDryLocation as! String?, best: handDryBest as! String?, options: handDryString as! String?)
                
                self.handDryList.append(handDry)
            }
            
            self.handDryTable.reloadData()
        }
    })
}

2. 修改数据存储逻辑(addHandDryLocation部分)

存储数据时已经基于修改后的refHandrylocations指向当前用户专属节点,原有存储逻辑无需额外调整,自动会写入到当前用户的节点下。

补充安全规则配置

仅修改前端代码无法完全避免数据越权问题,需要在Firebase控制台配置Realtime Database的安全规则,限制用户只能读写自己的节点:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

内容的提问来源于stack exchange,提问作者Logan Cohen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:18:00