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

