我在firebase网站上关注了用户组的安全数据访问:https://firebase.google.com/docs/firestore/solutions/role-based-access
现在我的角色如下:
service cloud.firestore {
// Roles admin = 0, owner = 1, writer = 2, reader = 3
match /databases/{database}/documents {
function isSignedIn() {
return request.auth != null;
}
function isAdmin() {
return isSignedIn() && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 0
}
match /projects/{project} {
function getRole(rsc) {
return rsc.data.roles[request.auth.uid];
}
function isOneOfRoles(rsc, array) {
return isSignedIn() && (getRole(rsc) in array);
}
function canRead() {
return isAdmin() || isOneOfRoles(resource, [1, 2, 3])
}
function canWrite() {
return isAdmin() || isOneOfRoles(resource, [1, 2])
}
allow read: if canRead();
allow write: if canWrite();
}
}
}
现在,当创建新用户时,他不是管理员而他没有项目 . 所以实际上他应该能够创建一个新项目,他的项目列表应该是空的 .
我正在执行此查询以检索所有项目:
getAllProjectsForUser(): Observable<Project[]> {
return from(this.fireStore.collection('projects').snapshotChanges().pipe(map((data => {
const projects: Project[] = [];
data.forEach((doc) => {
projects.push(new Project(doc.payload.doc.id, doc.payload.doc.data()['projectName'], doc.payload.doc.data()['companyName']));
});
return projects;
}))));
}
现在,当我是管理员时,一切都有效,但对于那些没有任何项目且不是管理员的人来说,它不起作用 .
我总是得到丢失或权限不足 . 当我在规则模拟器中运行查询时,它给了我:
错误:simulator.rules行[16],专栏[18] . 空值错误 . 这是在这一行:
return rsc.data.roles[request.auth.uid];
我不知道怎么解决这个问题?我尝试像这样更改查询:
getAllProjectsForUser(uuid: string): Observable<Project[]> {
return from(this.fireStore.collection('projects').ref.where('roles.' + uuid, '<', 4).get()).pipe(map((data => {
const projects: Project[] = [];
data.forEach((doc) => {
projects.push(new Project(doc.id, doc.data()['projectName'], doc.data()['companyName']));
});
return projects;
})));
}
但是这个问题给出了同样的问题,因为没有带有角色数组的项目 .
EDIT
我发现当我在firebase模拟器中测试它的工作规则时 . 这只是查询所有我没有的所有者|作者|读者的查询
截图数据: