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

默认数据库为Datastore模式的GCP项目中无法设置Firestore Native规则

多数据库场景下Firestore Native模式数据库的安全规则配置问题及解决方案

问题背景

在GCP项目中运行多个Firestore数据库,默认数据库为Datastore模式,同时存在一个Firestore Native模式数据库。尝试为Native模式数据库配置安全规则时遇到一系列问题,且项目因依赖Firebase无法拆分到其他项目,需为服务添加前端查看Firestore文档。

遇到的具体问题

  • 使用Firebase Console时,提示项目采用Cloud Firestore Datastore模式,仅可通过Google Cloud Console访问
  • 在Google Cloud Console中仅能查看Firestore规则,无法编辑
  • 使用Terraform部署规则时,工具显示应用成功,但Google Cloud Console中的规则未变更
  • 使用Firebase CLI时,报错提示该工具仅支持管理Native模式的Firestore项目

测试用安全规则

service cloud.firestore {
match /databases/{database}/documents {
    match /{document=**} {
        allow read, write: if true;
    }
}

现有Terraform代码

resource "google_project_service" "firestore" {
    project = local.project
    service = "firestore.googleapis.com"
}

resource "google_firestore_database" "database" {    
    project                           = local.project
    name                              = "name of the database"
    location_id                       = local.location
    type                              = "FIRESTORE_NATIVE"
    concurrency_mode                  = "PESSIMISTIC"
    app_engine_integration_mode       = "DISABLED"
    #point_in_time_recovery_enablement = "POINT_IN_TIME_RECOVERY_ENABLED"
    depends_on = [google_project_service.firestore]
}

resource "google_firebaserules_release" "primary" {
    name         = "cloud.firestore"
    ruleset_name = "projects/${local.project}/rulesets/${google_firebaserules_ruleset.firestore.name}"
    project      = local.project

    lifecycle {
      replace_triggered_by = [
        google_firebaserules_ruleset.firestore
      ]
    }
  }

resource "google_firebaserules_ruleset" "firestore" {
    source {
      files {
        content = file("firestore.rules")
        name    = "firestore.rules"
      }
  }

  project = local.project
}

解决方案

1. 修正Terraform配置指定目标数据库

原Terraform的google_firebaserules_release资源未指定目标数据库,默认会应用到项目的Datastore模式默认库。需添加database参数明确指向Native模式数据库:

resource "google_firebaserules_release" "primary" {
    name         = "cloud.firestore"
    ruleset_name = "projects/${local.project}/rulesets/${google_firebaserules_ruleset.firestore.name}"
    project      = local.project
    database     = google_firestore_database.database.name # 新增:指定Native模式数据库名称

    lifecycle {
      replace_triggered_by = [
        google_firebaserules_ruleset.firestore
      ]
    }
  }

2. 使用gcloud CLI直接部署规则

若Terraform配置仍有问题,可通过gcloud命令行直接操作,明确指定目标数据库:

  1. 创建规则集:
gcloud firestore rulesets create --source=firestore.rules --project=你的项目ID
  1. 将规则集发布到指定Native数据库:
gcloud firestore releases create --ruleset=projects/你的项目ID/rulesets/规则集ID --database=Native数据库名称 --project=你的项目ID

3. 前端访问时指定数据库名称

前端初始化Firestore时,需明确指定要连接的Native模式数据库,避免默认连接到Datastore模式数据库:

import { initializeApp } from "firebase/app";
import { initializeFirestore } from "firebase/firestore";

const firebaseConfig = { /* 你的Firebase配置 */ };
const app = initializeApp(firebaseConfig);

// 初始化时指定Native数据库名称
const db = initializeFirestore(app, {
  databaseId: "你的Native数据库名称"
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 03:32:47