【发布时间】:2021-09-10 21:54:45
【问题描述】:
我的安全规则中有以下功能
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']);
}
我的读取、更新和删除规则完全相同,但由于某种原因,我的读取规则权限不足,而更新和删除工作正常。如果我将读取规则更改为已登录,我也没有问题。在 firestore 操场上,读取规则通过。我似乎无法弄清楚发生了什么。
这是我在我的应用程序中的查询,再次使用登录验证时,这个观察者工作正常。
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);
}
});
}
有什么想法吗?
【问题讨论】:
标签: javascript firebase google-cloud-firestore firebase-security