当我从客户端创建项目时,我想确保他们没有篡改plan
和limits
:
service cloud.firestore {
function isSignedIn() {
return request.auth != null;
}
match /databases/{database}/documents {
match /projects/{projectId} {
function hasRole(rsc, role) {
return rsc.data.users[request.auth.uid].role == role;
}
function userExistsInProject(rsc) {
return (request.auth.uid) in rsc.data.users;
}
function projectResource() {
return get(/databases/$(database)/documents/projects/$(projectId));
}
function planIsStandard(rsc) {
return rsc.data.plan == 'standard' && rsc.data.limits.nodes == 1;
}
allow create: if isSignedIn() && planIsStandard(resource);
allow read: if isSignedIn() && userExistsInProject(resource);
allow write: if isSignedIn() && hasRole(resource, 'owner');
match /cluster/{clusterId} {
allow create, write: if isSignedIn() && hasRole(projectResource(), 'owner');
allow list, read: if isSignedIn() && userExistsInProject(projectResource());
}
}
}
}
planIsStandard
功能不起作用。如果我包含其中任何一个条件,则它不适用于以下内容:
await db.collection('projects').add({
plan: 'standard',
limits: {
nodes: 1,
},
name,
created: new Date(),
owner: user.uid,
users: {
[user.uid]: true,
},
});
如果我删除projectIsStandard
检查我可以创建文档。
这似乎是一个正常的规则,我看不出我在这里做错了什么?谢谢。
如果要检查传入文档的内容,则需要使用request.resource
而不是resource
。后者仅查看现有文档,如果存在的话。 request.resource
查看新文件,或对其提出的修改建议。
因此,您的规则仅查看数据库中的现有文档,这些文档永远不会应用于新创建的文档。