num*_*fin 11 firebase firebase-security google-cloud-firestore
只是一个简单的问题:这是错误的,为什么这不起作用?
尝试与用户部分中具有"admin"角色的用户访问/ titles/{anyTitle},但仍然可以访问
权限丢失或不足.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow write: if false;
allow read: if false;
}
function userCanWrite () {
return get(/databases/{database}/documents/users/$(request.auth.uid)).data.role == "admin";
}
match /titles/{anyTitle=**} {
allow read: if request.auth != null;
allow write: if userCanWrite();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我从官方文件中尝试了另一条规则
get(/databases/{database}/documents/users/$(request.auth.uid??)).data.isAdmin == true;
这也不行
支持帮助我找到解决方案,这是你应该做的:
数据库结构:
用户 - > {{userid}} - > {role:"admin"}
数据库规则设置:
get(usersPath/$(request.auth.uid)).role =="admin"|| get(usersPath/$(request.auth.uid)).data.role =="admin";
小智 14
我联系了Firebase支持部门报告该错误,他们给了我一个临时解决方案.看起来他们在安全规则方面的系统中存在错误.他们说文档没问题,但是现在我们应该这样解决:
get(path).data.field == true || get(path).field == true;
Run Code Online (Sandbox Code Playgroud)
因为错误是未填充数据对象,所以应检查这两个属性.没有ETA来启动这个bug的解决方案,所以我问他们是否可以在他们解决这个问题时给我一个建议,所以我会及时了解他们的信息.
所以我解决这个问题的方法是我创建了另一个Collection名为admins
然后我刚刚添加了uid我需要的用户 - 这是我的数据库结构 - https://i.stack.imgur.com/U2YnN.png
这是规则
service cloud.firestore {
match /databases/{database}/documents {
function isAdmin() {
return exists(/databases/$(database)/documents/admins/$(request.auth.uid));
}
match /tasks/{anyTask} {
allow read: if request.auth != null;
allow create: if request.auth != null;
allow update: if request.auth != null && isAdmin();
allow delete: if request.auth != null && isAdmin();
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在这里查看我的完整开源项目: https://github.com/metaburn/doocrate
您应该在代码中使用$(database)而不是:{database}
get(/databases/{database}/documents/users/$(request.auth.uid)).data.role == "admin";
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4834 次 |
| 最近记录: |