Firebase 安全规则:当文档具有特定字段时允许 'get'
Firebase security rules: allow 'get' when document has a specific field
我的用户注册过程是这样的
- 在 Stripe 上购买许可证
- 之后完成帐户
在 Stripe webhook/cloud 函数中,我们获取有关电子邮件和许可证的信息,并将其存储在 firestore stripe-customers
集合(具有生成的 ID)的新文档中。
之后完成帐户时,我们会询问 email/password,使用 firebase 进行身份验证,然后我们在 firestore customers
集合中创建一个文档(id=uid)
为了检查用户是否拥有有效许可证,我想授予经过身份验证的用户 'read' 使用匹配的电子邮件地址访问 stripe-customer 的权限。所以我想以某种方式检查 customer/uid/email (or auth.token.email) == stripe-customer/id/email
我尝试了以下安全规则,但显然,对于 'read',request
没有 resource
属性.
如何测试文档中 属性 的值?
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /customers/{uid} {
allow read, write: if request.auth != null && request.auth.uid == uid;
}
match /stripe-customers/{id} {
allow read: if request.resource.data.email == request.auth.token.email;
}
}
}
以及一些相关问题:
- 使用
uid
作为文档 ID 与使用生成的 ID 和文档 uid 属性 相比有什么好处吗?
request.resource
变量包含 updating/creating 文档时文档的未来状态。而是使用 resource.data
,它是文档中存储的所有字段和值的映射。
match /stripe-customers/{id} {
allow read: if resource.data.email == request.auth.token.email;
}
您可以在 documentation 中阅读更多相关信息。
Are there benefits in using uid as document-id versus having a generated id and a document uid property?
取决于用例,在这里我更喜欢用户的身份验证 UID 作为客户集合中的文档 ID,而来自 Stripe 的客户 ID 作为 stripe-customers 集合中的文档 ID。没有任何优势,但从 Firestore .doc('customers' + uid)
获取用户文档比使用 where('userId', '==', uid)
查询更容易。
我的用户注册过程是这样的
- 在 Stripe 上购买许可证
- 之后完成帐户
在 Stripe webhook/cloud 函数中,我们获取有关电子邮件和许可证的信息,并将其存储在 firestore stripe-customers
集合(具有生成的 ID)的新文档中。
之后完成帐户时,我们会询问 email/password,使用 firebase 进行身份验证,然后我们在 firestore customers
集合中创建一个文档(id=uid)
为了检查用户是否拥有有效许可证,我想授予经过身份验证的用户 'read' 使用匹配的电子邮件地址访问 stripe-customer 的权限。所以我想以某种方式检查 customer/uid/email (or auth.token.email) == stripe-customer/id/email
我尝试了以下安全规则,但显然,对于 'read',request
没有 resource
属性.
如何测试文档中 属性 的值?
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /customers/{uid} {
allow read, write: if request.auth != null && request.auth.uid == uid;
}
match /stripe-customers/{id} {
allow read: if request.resource.data.email == request.auth.token.email;
}
}
}
以及一些相关问题:
- 使用
uid
作为文档 ID 与使用生成的 ID 和文档 uid 属性 相比有什么好处吗?
request.resource
变量包含 updating/creating 文档时文档的未来状态。而是使用 resource.data
,它是文档中存储的所有字段和值的映射。
match /stripe-customers/{id} {
allow read: if resource.data.email == request.auth.token.email;
}
您可以在 documentation 中阅读更多相关信息。
Are there benefits in using uid as document-id versus having a generated id and a document uid property?
取决于用例,在这里我更喜欢用户的身份验证 UID 作为客户集合中的文档 ID,而来自 Stripe 的客户 ID 作为 stripe-customers 集合中的文档 ID。没有任何优势,但从 Firestore .doc('customers' + uid)
获取用户文档比使用 where('userId', '==', uid)
查询更容易。