Firestore 规则有问题

问题描述 投票:0回答:1

在 Firestore 中设置某些规则时遇到问题。所以基本上creatorId都在文档中,我不明白规则是怎么回事。我在规则中对 id 进行了硬编码,如果我执行 `request.auth.uid == 'iv4Lk1148KVBkney3eFdNZPWMC43'; 它就会起作用。它有效。

我真的不知道如何解决这个问题。

match /jobApplications/{applicationId} {
    allow read: if request.auth != null && request.auth.uid == resource.data.creatorId;
    allow write: if request.auth != null;
}

我正在构建一个 Flutter 应用程序,这是负责从

jobApplications
获取数据的方法。它是无限滚动列表的一部分。

void _loadMoreApplications() async {
  final CollectionReference applicationsRef =
      FirebaseFirestore.instance.collection('jobApplications');

  Query query = applicationsRef.limit(25);

  if (lastDocument != null) {
    query = query.startAfterDocument(lastDocument!);
    setState(() {
      isLoadingMoreApplications = true;
    });
  }

  try {
    final applicationDocs = await query.get();
    if (applicationDocs.docs.isNotEmpty) {
      lastDocument = applicationDocs.docs.last;

      Set<ApplicationModel> uniqueApplications = applications.toSet();

      for (var doc in applicationDocs.docs) {
        uniqueApplications.add(ApplicationModel.fromFirestore(doc));
      }

      applications = uniqueApplications.toList();

      setState(() {
        showSpinner = false;
      });
    }

    setState(() {
      isLoadingMoreApplications = false;
    });
  } catch (error) {
    print('Error fetching applications: $error');
  }
}

捕获的打印:

flutter: 获取应用程序时出错:[cloud_firestore/permission-denied] 调用者没有执行指定操作的权限。

flutter google-cloud-firestore firebase-security
1个回答
1
投票

您似乎错过了文档部分,其中解释了安全规则不是过滤器,而是它们只是检查代码是否请求了超出允许范围的数据。

您的代码向所有用户请求文档,而规则明确规定它只能向当前用户请求文档。由于代码请求的文档多于允许的文档,因此规则拒绝该操作。

为了满足规则的要求,代码应该只请求当前用户的文档,因此在

where
上附加一个
creatorId
条件。

另请查看其他有关规则不是过滤器的问题,因为这是一个非常常见的错误。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.