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

