Firestore安全规则读取数组长度触发权限错误问题
Firestore安全规则数组长度判断触发权限错误问题
我编写了以下Firestore安全规则:
match /users/{userId}/{document=**} { allow read, update, delete: if request.auth != null && request.auth.uid == userId; allow create: if request.auth != null && request.auth.uid == userId && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role<6 //&& get(/databases/$(database)/documents/users/$(request.auth.uid)).data.roles_array.length <6 }
其中&& get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role<6可正常生效,但启用&& get(/databases/$(database)/documents/users/$(request.auth.uid)).data.roles_array.length <6这行数组长度判断时,会触发权限错误。
数据库截图:
问题排查与解决方案
字段类型与存在性校验
Firestore安全规则中,若字段不存在或类型不匹配,访问其属性会直接触发权限拒绝。需先确认roles_array是数组类型,再判断长度:match /users/{userId}/{document=**} { let userDoc = get(/databases/$(database)/documents/users/$(request.auth.uid)); allow read, update, delete: if request.auth != null && request.auth.uid == userId; allow create: if request.auth != null && request.auth.uid == userId && userDoc.data.role <6 && userDoc.data.roles_array is list && userDoc.data.roles_array.length <6; }避免重复读取文档
将get()结果赋值给变量userDoc,减少重复查询,同时提升规则可读性。文档存在性确认
确保/users/$(request.auth.uid)路径下的文档确实存在,若文档不存在,get()操作会直接导致规则条件不通过,触发权限错误。
内容的提问来源于stack exchange,提问作者awariat
相关产品推荐
相关产品推荐

