我有以下收藏
/公司
/用户
在用户文档中,我有一个companyUuid来引用其公司成员身份,还有一个名为Permission的对象,该对象具有两个属性:
{
admin : true|false
superAdmin: true | false
}
我的应用程序逻辑如下:
我的担心是,鉴于我将权限存储在用户文档中,如何有效地防止非管理员写入他们的权限对象,同时还允许他们编辑用户文档中的字段?
我这里有一些代码,我认为它看起来太复杂了,必须有一种更简单的方法。如果您指出正确的方向,我将不胜感激:
match /users/{userUuid} {
allow read: if request.auth != null && belongsToSameCompany()
function areAdminPermissionsIntact(){
return request.resource.permissions.admin == resource.permissions.admin
}
function areSuperAdminPermissionsIntact(){
return request.resource.permissions.superAdmin == resource.permissions.superAdmin
}
function isNotTheSameUser(){
return resource.data.uuid != request.auth.uid
}
function belongsToSameCompany(){
return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.companyUuid == resource.data.companyUuid
}
allow write: if request.auth != null
&&
(areAdminPermissionsIntact() || areAdminPermissionsIntact() == false && resource.data.permissions.admin == true && isNotTheSameUser() && belongsToSameCompany())
&&
(areSuperAdminPermissionsIntact() || areSuperAdminPermissionsIntact() == false && resource.data.permissions.superAdmin == true && isNotTheSameUser() && belongsToSameCompany())
}
答案 0 :(得分:1)
没有比这更简单的了。您必须检查不应更改的字段是否没有更改,而这正是您在这里所做的。
您可以使用MapDiff API来检查请求和资源之间未更改的字段列表,这有点不同,但是说实话,这不会使事情变得那么简单。