我正在尝试将安全规则建立在对另一个对象的引用上。
我有一组用户和一组角色。用户对象有一个名为“role”的字段,它是对角色集合中特定文档的引用。
users
id
name
role <-- reference to particular role
roles
id
name
isSuperUser
这里的目标是允许具有特定角色(isSuperUser == true 的角色)的用户编辑任何其他角色或其子集合;
以下是我认为会奏效的规则:
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId=**} {
allow read, write: if request.auth.uid == userId;
}
match /roles/{roleId=**} {
function isSuperUser() {
return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role.isSuperuser == true;
}
allow read: if request.auth.uid != null;
allow write: if isSuperUser();
}
}
我已经确认了以下作品,但它并不是那么有用......
get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role != null;
如果有更好的方法来实现角色基础安全,我会全力以赴。
缺乏任何调试工具使这非常令人沮丧。
最佳答案
我知道距离最初的问题已经有一段时间了,但我遇到了类似的问题,我希望这可以帮助您或其他人。
你的情况是:get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role.isSuperuser == true;
但是role
是一个引用,这(显然)意味着您需要 get
它也是。尝试这个:get(get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role).data.isSuperuser == true;
关于firebase - Firestore 安全规则使用对另一个文档的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47233942/