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

Flutter Firebase实现用户公司关联及同公司任务权限控制

解决Flutter Firebase任务的公司权限控制问题

1. 给新任务添加公司标识

不用改动你原有任务创建的核心逻辑,只需要在提交任务数据时,额外加入一个companyId字段(值为当前用户所属公司的唯一标识)。假设你已经能获取到当前用户的公司信息(比如存在Firebase Auth自定义Claims或Firestore用户文档中):

// 先获取当前用户的公司ID
String? currentUserCompanyId = await getCurrentUserCompanyId();

// 保留原有创建逻辑,新增companyId字段
await FirebaseFirestore.instance.collection('tasks').add({
  'title': taskTitle,
  'description': taskDescription,
  // ...你原本的其他任务字段
  'companyId': currentUserCompanyId,
  'createdAt': FieldValue.serverTimestamp(),
});

2. 修改StreamBuilder的查询过滤逻辑

原来的StreamBuilder会拉取所有任务,现在添加过滤条件,只加载与当前用户同公司的任务:

StreamBuilder<QuerySnapshot>(
  stream: FirebaseFirestore.instance
      .collection('tasks')
      // 关键:过滤出companyId匹配的任务
      .where('companyId', isEqualTo: currentUserCompanyId)
      .snapshots(),
  builder: (context, snapshot) {
    // 你原有的UI构建逻辑完全不需要改动,现在只会渲染同公司的任务
    if (snapshot.hasData) {
      return ListView.builder(
        itemCount: snapshot.data!.docs.length,
        itemBuilder: (context, index) {
          var task = snapshot.data!.docs[index];
          return ListTile(
            title: Text(task['title']),
            subtitle: Text(task['description']),
            // ...你原本的编辑、删除逻辑
          );
        },
      );
    }
    return CircularProgressIndicator();
  },
);

3. 配置Firebase安全规则(核心,不能省略)

客户端过滤只是表层限制,恶意用户可以绕过直接访问数据库,所以必须通过Firestore安全规则锁死权限:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /tasks/{taskId} {
      // 读权限:仅登录用户,且任务的companyId与用户自身的一致
      allow read: if request.auth != null && resource.data.companyId == request.auth.token.companyId;
      // 创建权限:仅登录用户,且提交的任务companyId与自身一致(防止乱创建其他公司的任务)
      allow create: if request.auth != null && request.resource.data.companyId == request.auth.token.companyId;
      // 更新/删除权限:仅同公司用户(如需更细粒度,比如只能操作自己创建的任务,可额外添加判断条件)
      allow update, delete: if request.auth != null && resource.data.companyId == request.auth.token.companyId;
    }
  }
}

如果你的用户公司信息存储在Firestore的users集合中,规则可以改为从用户文档读取companyId:

allow read: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.companyId == resource.data.companyId;

4. 用户公司信息的存储建议

  • Firebase Auth自定义Claims:适合公司ID不频繁变更的场景,通过Cloud Functions设置,客户端可直接从FirebaseAuth.instance.currentUser?.getIdTokenResult()获取,速度快。
  • Firestore用户文档:适合公司ID可能变更的场景,用户登录后先查询自身的用户文档,将companyId缓存后复用。

这样修改后,既保留了你原有的任务创建、编辑逻辑,又实现了仅同公司用户可见对应任务的权限控制,同时通过安全规则保障了数据安全性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:55:06