默认数据库为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命令行直接操作,明确指定目标数据库:
- 创建规则集:
gcloud firestore rulesets create --source=firestore.rules --project=你的项目ID
- 将规则集发布到指定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
相关产品推荐
相关产品推荐

