Flutter应用Cloud Firestore用户权限读取及安全规则配置问题
问题核心原因
你遇到的snapshot报错本质是触发了Firestore安全规则的规则不是过滤器特性:你直接请求整个orders集合的全量数据,但安全规则不允许你获取不属于自己的订单,会直接拒绝整个查询请求,不会自动帮你过滤出符合权限的数据。
另外你之前想把用户ID当文档ID的思路不适合多订单场景,你现在用add()方法自动生成文档ID、把用户UID存在文档字段的方案是对的,只要配套改查询和安全规则就行。
第一步:修改读取数据的查询代码
查询的时候要主动加过滤条件,只拉取当前登录用户的订单,和后续的安全规则匹配,修改后的代码如下:
// 调用查询前先校验用户已登录 var firebaseUser = FirebaseAuth.instance.currentUser; if (firebaseUser == null) { // 这里可以加跳转到登录页的逻辑 return const SizedBox(); } StreamBuilder<QuerySnapshot>( stream: FirebaseFirestore.instance .collection('orders') .where('uid', isEqualTo: firebaseUser.uid) // 新增过滤条件,只查当前用户的订单 .snapshots(), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return const Center( child: CircularProgressIndicator(), ); } else { if (snapshot.hasError) { return const Center( child: Text('Oops, something went wrong...'), ); } } // 原有列表渲染逻辑不变 } )
你现有的添加订单代码不需要修改,add()会自动生成唯一的订单文档ID,不会出现同用户多订单ID冲突的问题。
第二步:配置Cloud Firestore安全规则
打开Firebase控制台,进入Firestore数据库的「规则」页面,替换为以下配置:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /orders/{orderId} { // 读取权限:仅登录用户可以读取自己uid对应的订单 allow read: if request.auth != null && request.auth.uid == resource.data.uid; // 写入权限:仅登录用户可以写入uid为自己id的订单 allow create: if request.auth != null && request.resource.data.uid == request.auth.uid; // 如果需要支持修改、删除自己的订单,保留下面这行,不需要可以删除 allow update, delete: if request.auth != null && request.auth.uid == resource.data.uid; } } }
配置完成后等待1分钟左右规则生效,再运行代码就不会出现snapshot报错,同时也实现了用户只能访问自己订单的权限控制。
内容的提问来源于stack exchange,提问作者supremo
相关产品推荐
相关产品推荐

