Firestore安全规则适用于删除和更新,但不适用于读取



我的安全规则中有以下功能

function isSignedIn() {
return request.auth != null;
}
function getRole(workspaceId) {
return get(/databases/$(database)/documents/roles/$(workspaceId)/members/$(request.auth.uid)).data.role
}

function isOneOfRolesOtherResource(rsc, array) {
return isSignedIn() && (getRole(rsc.data.workspace_id) in array);
}

以及我的任务集合的以下规则。

match /tasks/{document=**} {
allow create: if isOneOfRolesOtherResource(request.resource, ['ADMIN', 'MANAGER', 'MEMBER', 'GUEST']);
allow read: if isOneOfRolesOtherResource(resource, ['ADMIN', 'MANAGER', 'MEMBER', 'GUEST']);
allow update, delete: if isOneOfRolesOtherResource(resource, ['ADMIN', 'MANAGER', 'MEMBER', 'GUEST']);
}

我的读取、更新和删除规则完全相同,但由于某些原因,我的读取规则权限不足,而更新和删除工作正常。如果我将读取规则更改为已登录,我也没有问题。在消防队的操场上,阅读规则通过了。我似乎搞不清楚发生了什么事。

这是我在应用程序中的查询,同样,当只使用登录验证时,这个观察者工作得很好。

const query = db
.collection(TASKS_STORENAME)
.where('project_id', '==', activeProject.value.id);

projectTasksObserver = query.onSnapshot(
(querySnapshot) => {
querySnapshot.docChanges().forEach((change) => {
const taskData = change.doc.data() as TaskData;
const task = Task.deserialize(taskData);
console.log('task change type:', change.type);
if (change.type === 'added') {
addProjectTask(task);
}
if (change.type === 'modified') {
updateProjectTask(task);
}
if (change.type === 'removed') {
removeProjectTask(task);
}
});
}

有什么想法吗?

想明白了。问题是我的查询不够具体,所以谷歌认为我没有足够的权限。

添加工作区筛选器成功。

const query = db
.collection(TASKS_STORENAME)
.where('workspace_id', '==', activeProject.value.workspace_id)
.where('project_id', '==', activeProject.value.id);

问题在规则的范围内。createupdatedelete规则始终以单个文档为目标,然后规则引擎可以检查其目标资源是否包含必要的值。

您的read规则同时涵盖get(读取单个文档(和list(查询/读取多个文档(,在后一种情况下,Firestore必须检查每个当前和未来的文档,这将对性能造成阻碍。在规则不是过滤器的情况下,文档涵盖了这一点。

规则本身不是过滤器,但它们只是强制要求您不要试图读取未经授权的数据。解决方案是(正如我所看到的,您自己也发现了(,在查询中包含与规则强制执行的条件相同的条件。

最新更新