如何修改Firebase规则实现每个用户拥有独立待办事项列表?
解决多用户待办列表混同问题
你的问题核心是待办数据没有和用户UID绑定,加上Firestore规则未做权限限制,导致所有用户读取的是同一批数据。按以下步骤修改即可解决:
1. 调整Firestore数据结构
给每个待办文档新增userId字段,值为当前登录用户的UID(从firebase.auth().currentUser.uid获取)。示例文档结构:
{ "title": "完成React Native学习", "completed": false, "userId": "abc123xyz" // 替换为实际用户UID }
2. 更新Firestore安全规则
替换原规则为以下内容,确保用户只能读写自己的待办:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /todos/{todoId} { // 读取/更新/删除:用户已登录且文档属于该用户 allow read, write: if request.auth != null && request.auth.uid == resource.data.userId; // 创建待办:强制写入当前用户UID allow create: if request.auth != null && request.resource.data.userId == request.auth.uid; } } }
注意:把
todos换成你实际使用的待办集合名称。
3. 修改前端代码
(1)添加待办时绑定用户UID
在创建待办的逻辑里,带上当前用户的UID:
// 示例:替换你现有的添加待办代码 import { getAuth } from "firebase/auth"; import { addDoc, collection } from "firebase/firestore"; const auth = getAuth(); const currentUser = auth.currentUser; if (currentUser) { await addDoc(collection(db, "todos"), { title: "新待办标题", completed: false, userId: currentUser.uid // 必须添加这个字段 }); }
(2)List.tsx中过滤当前用户的待办
修改数据查询逻辑,只获取当前用户的待办:
// List.tsx中的查询部分 import { getAuth } from "firebase/auth"; import { collection, query, where, onSnapshot } from "firebase/firestore"; import { useState, useEffect } from "react"; const auth = getAuth(); const [todos, setTodos] = useState([]); useEffect(() => { const currentUser = auth.currentUser; if (!currentUser) return; // 构建带用户UID过滤的查询 const userTodosQuery = query( collection(db, "todos"), where("userId", "==", currentUser.uid) ); // 监听数据变化 const unsubscribe = onSnapshot(userTodosQuery, (snapshot) => { const userTodos = snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })); setTodos(userTodos); }); return unsubscribe; // 组件卸载时取消监听 }, []);
(3)Login.tsx登录后自动刷新数据
由于上面的useEffect会在组件挂载时执行,登录成功后跳转回List页面时会自动重新查询当前用户的待办,无需额外操作。如果登录后没有自动刷新,可以在登录成功的回调里手动触发页面刷新或重新获取数据。
4. 修复规则修改导致的崩溃问题
之前修改规则后崩溃,是因为规则限制了访问,但前端仍在查询所有待办,触发了权限拒绝错误。按上面的步骤修改后,前端只请求当前用户的数据,规则允许访问,就不会再崩溃了。
内容的提问来源于stack exchange,提问作者Alessandro
相关产品推荐
相关产品推荐

