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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:16:04