问题描述
我正在为一个应用程序(在Firebase / firestore中)构建一个管理UI,使管理员管理员可以访问其团队的个人用户帐户并直接查看其仪表板/数据。由于这本质上与为不同用户组创建管理员相同,因此我认为可以通过自定义声明来实现。问题是我在不削弱用于保护用户帐户数据或将登录凭据存储在“管理员帐户” firestore个人资料doc中的firestore规则的情况下实现该问题时遇到了麻烦。有人可以帮助我了解我在这里缺少什么吗?谢谢!
这是我们现有的当前Firestore规则的摘录。
match /teams/{team}{
allow create
allow read: if (request.auth.token.role == 'member' || request.auth.token.role == 'supervisor') && request.auth.token.email_verified == true
allow update,delete: if (request.auth.token.role == 'member' || request.auth.token.role == 'supervisor') && request.auth.token.email_verified == true
}
match /supervisors/{supervisor}
{
allow create
allow read: if (request.auth.token.role == 'supervisor' || request.auth.token.role == 'member') && request.auth.token.email_verified == true
allow update,delete: if request.auth.token.role == 'supervisor' && request.auth.uid == supervisor && request.auth.token.email_verified == true
}
解决方法
好吧,我建议不要创建两个数据库,而要使用单个数据库“团队”,在该数据库中还要创建一个负责分配特定团队名称的主管角色。 创建一个安全规则,以检查人员是否是该特定团队的主管(通过检查团队名称参数)。
编辑: 您可以实际添加iSSupervisor和SupervisorOf(团队名称)作为参数,并可以添加安全规则,如
function notAllowedChange(field) {
//Parameters not allowed to be changed
return !(field in request.resource.data) || (field in resource.data && resource.data[field] == request.resource.data[field]);
}
match /teams/{userId} {
allow write: if userId == request.auth.uid
&& notAllowedChange('iSSupervisor') && notAllowedChange('SupervisorOf');
allow write: if get(/databases/$(database)/documents/teams/$(request.auth.uid)).data.iSSupervisor == true && get(/databases/$(database)/documents/teams/$(request.auth.uid)).data.SupervisorOf == resource.data.teamName;
allow read: if true;
}
希望这对您有所帮助! 抱歉,稍后包含代码。