【问题标题】:Cloud Firestore Security Rules - (Read, Write)Cloud Firestore 安全规则 -(读取、写入)
【发布时间】: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
  • 谢谢,我正在努力...

标签: flutter google-cloud-firestore firebase-authentication firebase-security


【解决方案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,
                  });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 2018-04-05
      • 2020-02-25
      • 2021-03-30
      • 2021-04-21
      相关资源
      最近更新 更多