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 安全规则 -(读取、写入)的主要内容,如果未能解决你的问题,请参考以下文章

Firestore:删除文档和安全规则

Firebase Cloud Storage 规则能否针对 Firestore 数据进行验证?

在 Cloud Firestore 规则中,request.auth.uid 似乎始终为空

具有身份验证的Cloud Firestore

使用规则禁用 Firebase Cloud Firestore 中的查询集合

Flutter Web App 无法访问 Firebase Cloud Firestore