我正在尝试根据用户在文档中的“角色”以及他们是否已登录来限制对 collection
的访问。
只需检查他们是否已登录即可:
rules_version = '2';
function isSignedIn() {
return request.auth != null;
}
service cloud.firestore {
match /databases/{database}/documents {
match /workspaces/{workspace} {
allow read: if isSignedIn();
}
}
}
但我想让它更细化一点,I'm following this Google guide。当我配置它时,我的前端客户端错误与 FirebaseError: Missing or insufficient permissions
完全相同。但是,在 Firebase 门户中测试规则有效(?)。
rules_version = '2';
function isSignedIn() {
return request.auth != null;
}
function getRole(rsc) {
return rsc.data.access[request.auth.uid];
}
function isOneOfRoles(rsc, array) {
return isSignedIn() && (getRole(rsc) in array);
}
service cloud.firestore {
match /databases/{database}/documents {
match /workspaces/{workspace} {
allow read: if isOneOfRoles(resource, ["owner", "viewer"]);
}
}
}
如前所述,通过 Firebase 测试规则有效,但是从我的前端应用程序查询时失败。
// VueJS
let workspace = []
async fetchWorkspaces() {
const db = firebase.firestore();
await db.collection('workspaces').get().then(response => {
response.forEach(snapshot => {
this.workspaces.push(snapshot.data());
})
})
}
数据库文件
我还尝试将每个用户的 RBAC 作为文档存储在子集合中并使用以下规则
allow read: if isSignedIn() && exists(/databases/$(database)/documents/workspaces/$(workspace)/users/$(request.auth.uid));
还是不行。我似乎只能授予广泛的访问权限(已登录)