如何为尚未创建的 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 中看到:
- 被拒绝的
read
和 write
规则使用 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
的字段的值传递吗?
我正在使用 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 中看到:
- 被拒绝的
read
和write
规则使用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
的字段的值传递吗?