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

Firestore权限规则优化咨询:如何实现管理员查看全部文档、普通用户仅查看已发布文档

解决Firestore管理员与普通用户的文档查询权限问题

你的需求非常合理——既要让普通用户只能访问已发布文档(且必须通过查询条件约束),又要让管理员能不受限制查看所有内容,同时不想把权限判断放在客户端带来安全风险。我来给你一个更优的规则调整方案:

调整后的Firestore规则

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    function isSignIn() {
      return request.auth.uid != null
    }
    function isAdmin() {
      return exists(/databases/$(database)/documents/admins/$(request.auth.uid))
    }
    function isPublished() {
      return resource.data.published == true
    }
    // 新增:验证普通用户的查询是否包含published=true的条件
    function hasPublishedQuery() {
      return request.query.where != null && 
             request.query.where.get("published").compare("==", true);
    }

    match /instructions/{instructionId} {
      allow list: if isSignIn() && request.query.limit <= 10 && 
        (isAdmin() || (isPublished() && hasPublishedQuery()));
    }
  }
}

规则逻辑说明

这个调整的核心是区分管理员和普通用户的查询验证逻辑:

  • 对于管理员:只要登录且查询条数不超限制,直接允许所有查询,不需要任何published相关的条件约束
  • 对于普通用户:必须同时满足两个要求:
    1. 文档本身是已发布状态(isPublished())
    2. 查询语句中明确包含published == true的过滤条件(hasPublishedQuery())

客户端查询示例

  • 管理员可以直接查询所有文档,不需要额外条件:
firestore.collection("instructions")
  .limit(10)
  .get()

这个请求会被规则通过,因为isAdmin()为true,跳过了普通用户的校验逻辑。

  • 普通用户必须使用你之前的带条件查询:
firestore.collection("instructions")
  .whereEqualTo("published", true)
  .limit(10)
  .get()

如果普通用户尝试去掉whereEqualTo条件,规则会直接拒绝请求——因为既不是管理员,又不满足查询条件的校验,从根源上杜绝了非法访问。

为什么这个方案更安全?

所有权限判断都放在Firestore规则层,客户端不需要做任何用户角色判断。哪怕客户端代码出现疏漏(比如普通用户调用了管理员的查询逻辑),规则也会拦截非法请求,完全避免了客户端权限校验带来的安全隐患。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:42:31