如何为尚未创建的 Flutter 集合添加 firebase 安全规则

How to add firebase security rules for Flutter collection that hasn't been created yet

我正在使用 Firebase Auth 和 Firestore 数据库。我正在尝试向 Firebase 数据库添加安全规则,以允许用户阅读、更新、创建和删除帖子。当我在 Rules Playground 中测试我的规则时,访问被拒绝,所以我知道我没有正确编写规则。这是添加安全规则之前的数据库图像。

现在我已经添加了安全规则,但未创建帖子集合,并且我在规则游乐场中收到错误消息:

> Simulated write denied 
> Simulated read denied

我得到以下控制台错误:

The following _CastError was thrown building CommunityPage(dirty, dependencies: [_InheritedProviderScope<UserProvider?>], state: _CommunityPageState#f5d54): type 'Null' is not a subtype of type 'String' in type cast

在该应用中,所有用户都应该能够创建帖子以添加到他们的个人资料中。当用户有一个新创建的帐户时,他们还没有任何帖子,所以我试图弄清楚如何包含安全规则,允许显示帖子的页面出现,即使它没有任何内容时创建了一个新用户。我已经查看了 SO 线程和 Firebase 文档,但由于我是 Flutter 和 Firebase 的新手,所以我无法弄清楚。

如有任何帮助,我们将不胜感激。谢谢。

我们可以在 Rules Playground 中看到:

  • 被拒绝的 readwrite 规则使用 isSignedIn() 函数检查 request.auth 对象是否不是 null;
  • 但您在使用 Rules Playground 时不会模拟用户的身份验证:请参阅 Rules Playground 左侧窗格中“运行”按钮上方的“已验证”开关

您应该在 Rules Playground 中激活身份验证模拟,以便您的 isSignedIn() 函数被评估为 true

请注意,很可能是 Playground 右侧显示的错误显示了与此问题相对应的消息,但我们没有在您的屏幕截图中看到它。


根据您的评论更新:

注意 request.resource 只能在 write 规则中使用(参见 doc):这可能解释了 read 规则的问题(截图在你问题的底部)。你必须做:

allow read: if isSignedIn() && request.auth.uid == resource.data.uid

注意上面的规则意味着在post文档中有一个名为uid的字段

对于create规则错误:您确定将用户的uid作为新创建文档中名为uid的字段的值传递吗?