Cloud Firestore 安全规则 -(读取、写入)
Posted
技术标签:
【中文标题】Cloud Firestore 安全规则 -(读取、写入)【英文标题】:Cloud Firestore Security Rules - (Read, Write) 【发布时间】:2021-12-11 05:19:49 【问题描述】:在我的 Flutter 应用程序中,我希望允许登录用户能够读取他们创建的文档(仅当 DocumentID 与 UserID 相同时)。问题是 documentID 是由 firebase 自动生成的。当我使用登录的 UserID 明确指定 documentID 时,用户无法创建多个文档,因为 documentID 已经存在。请帮忙...
结果总是在下面显示快照错误...
StreamBuilder<QuerySnapshot>(
stream: FirebaseFirestore.instance.collection('orders').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...'),
);
向 Firestore 添加数据
onPressed: ()
var firebaseUser = FirebaseAuth.instance.currentUser;
FirebaseFirestore.instance.collection('orders').add(
'date': FieldValue.serverTimestamp(),
'product': 'Jeans',
'total': cart.totalAmount,
'uid': firebaseUser!.uid,
);
cart.clearCart();
,
显示来自 Firestore 的数据
StreamBuilder<QuerySnapshot>(
stream: FirebaseFirestore.instance.collection('orders').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...'),
);
安全规则
【问题讨论】:
如果您想创建一个与登录用户 ID 具有相同 ID 的文档,那么您将只能制作一个文档,因为用户的 ID 不会更改。要解决此问题,您必须在创建新文档之前删除旧文档。或者允许生成订单文档 ID 并在该文档上保存用户 ID,这样您就可以查询“userID 为 currentUser.id 的所有订单” 嗨@Amxela,感谢您的及时回复。我想我将不得不查询 UserID 为 currentUserID 的所有订单。 与firebase firestore和flutter相关的一切都可以在这里找到firebase.flutter.dev/docs/firestore/usage查询具体在这里firebase.flutter.dev/docs/firestore/usage/#querying 谢谢,我正在努力... 【参考方案1】:如果您希望用户能够创建多个文档,则不能使用他们的 UID 作为文档 ID - 因为文档 ID 在集合中是唯一的。
常见的方法是使用add()
文档让 Firestore 生成唯一的文档 ID,然后将用户的 UID
存储在每个文档的字段中(您似乎已经这样做了)。
然后,您可以通过在写入规则中调用 isOwner
帮助函数来强制用户只能在安全规则中写入包含自己的 UID 的文档:
allow write: if request.auth != null && isOwner();
【讨论】:
【参考方案2】:在数据库中添加数据时获取documentId:
DocumentReference docRef = _firestore.collection("orders").doc();
await docRef.set(
'id': docRef.id,
'date': FieldValue.serverTimestamp(),
'product': 'Jeans',
'total': cart.totalAmount,
'uid': firebaseUser!.uid,
);
【讨论】:
以上是关于Cloud Firestore 安全规则 -(读取、写入)的主要内容,如果未能解决你的问题,请参考以下文章
Firebase Cloud Storage 规则能否针对 Firestore 数据进行验证?
在 Cloud Firestore 规则中,request.auth.uid 似乎始终为空