Firestore:创建文档属性前如何校验文档所有者?
问题分析与解决方案
报错原因
你当前的规则存在两个核心问题:
- 路径中的
{document}是文档ID的占位符变量,并非文档的数据对象,因此无法通过document.owner访问文档字段。 create操作是创建全新文档,此时目标文档尚未存在,根本无法读取它的owner字段——只有针对已存在文档的操作(如update/read),才能访问文档的现有数据。
结合你的场景(用户在自己已创建的文档内新增属性),你实际需要的是update操作的权限校验,而非create。
正确规则示例
1. 创建新文档时的校验(确保用户只能创建属于自己的文档)
如果需要允许用户创建新文档,且要求文档的owner字段必须设为自己的UID:
match /moviesCommentID/{docId} { allow create: if request.auth != null && request.resource.data.owner == request.auth.uid; }
request.resource.data:代表要创建的新文档的完整数据,通过它校验用户提交的owner字段是否为当前用户UID。
2. 更新已有文档时的校验(允许用户修改自己创建的文档)
针对你提到的“在已创建的文档内新增属性”场景,使用update规则校验文档所有者:
match /moviesCommentID/{docId} { allow update: if request.auth != null && resource.data.owner == request.auth.uid; }
resource.data:代表已存在的目标文档的当前数据,通过它读取owner字段并与当前用户UID对比。
3. 完整规则(同时支持创建和更新)
如果需要同时允许用户创建自己的文档,以及修改自己已创建的文档,完整规则如下:
match /moviesCommentID/{docId} { // 创建新文档:确保提交的owner为当前用户 allow create: if request.auth != null && request.resource.data.owner == request.auth.uid; // 更新文档:确保文档所有者为当前用户 allow update: if request.auth != null && resource.data.owner == request.auth.uid; // 可选:允许用户读取自己的文档 allow read: if request.auth != null && resource.data.owner == request.auth.uid; }
关键概念说明
request.resource.data:用于create/update操作,指向即将写入的文档数据。resource.data:用于update/read操作,指向已存在的文档的当前数据。- 路径占位符(如
{docId})仅代表文档ID字符串,不能直接访问文档的字段内容。
内容的提问来源于stack exchange,提问作者user1998844
相关产品推荐
相关产品推荐

