You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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这行数组长度判断时,会触发权限错误。

数据库截图:
数据库截图

问题排查与解决方案

  1. 字段类型与存在性校验
    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;
    }
    
  2. 避免重复读取文档
    将get()结果赋值给变量userDoc,减少重复查询,同时提升规则可读性。

  3. 文档存在性确认
    确保/users/$(request.auth.uid)路径下的文档确实存在,若文档不存在,get()操作会直接导致规则条件不通过,触发权限错误。

内容的提问来源于stack exchange,提问作者awariat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:16:11