如何编写Firestore规则,实现跨集合查询匹配字段值的权限控制
Firestore跨集合角色权限控制规则实现
原有代码问题梳理
get()方法需要传入完整的文档路径,原有代码仅传入了roles集合路径,无法正确获取对应用户的角色文档hasRoles函数入参逻辑错误:原有代码传入的是「uid是否匹配」的布尔值,而非对应用户的角色数组,导致权限判断完全不生效- 权限冗余:
write权限已经包含create、update、delete权限,不需要重复声明create
推荐实现方案
优先将roles集合的文档ID设置为对应用户的uid,该方案性能最优,不需要额外查询过滤,完整规则如下:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 角色校验函数:判断用户角色数组是否包含要求的任意一个角色 function hasRoles(userRoles, requiredRoles) { return requiredRoles.some(role => userRoles.hasAny([role])); } // 示例:给需要控制权限的集合配置规则,这里以content集合为例 match /content/{contentId} { allow write: if // 先校验用户已登录 request.auth != null // 校验当前用户的角色文档存在 && exists(/databases/$(database)/documents/roles/$(request.auth.uid)) // 校验用户包含super_admin角色 && hasRoles(get(/databases/$(database)/documents/roles/$(request.auth.uid)).data.roles, ['super_admin']); } } }
拓展说明
如果需要校验用户同时满足多个角色要求,将hasRoles函数中的some方法替换为every即可。
如果你的roles集合没有用用户uid作为文档ID,需要调整集合结构,Firestore安全规则不支持集合查询,必须直接指定文档路径才能获取对应数据。
内容的提问来源于stack exchange,提问作者Nicholas
相关产品推荐
相关产品推荐

