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

为何Firebase安全规则在数据库模拟器中无法限制@firebase/rules-unit-testing访问?

问题原因及解决方案

问题根源

测试失败的核心原因是测试环境未加载你配置的数据库规则,导致权限校验时没有应用".read": "false"的限制,未认证用户依然能读取数据,最终触发assertFails断言失败。

@firebase/rules-unit-testing库不会自动读取本地的database.rules.json文件,必须显式将规则加载到测试环境中,否则测试会使用默认规则(或模拟器临时的规则状态),而非你期望的拒绝所有读写的配置。

修复方案

你可以通过两种方式将规则加载到测试环境:

方式一:从本地规则文件加载

引入fs模块读取规则文件,在测试环境初始化后调用loadRules方法加载:

import {
  assertFails,
  initializeTestEnvironment,
  RulesTestEnvironment,
} from "@firebase/rules-unit-testing";
import { describe, beforeEach, it } from "mocha";
import { ref, get } from "firebase/database";
import fs from "fs";

describe("earth security rules tests", () => {
  let testEnv: RulesTestEnvironment;

  beforeEach(async () => {
    testEnv = await initializeTestEnvironment({
      projectId: "PROJECT_NAME",
      database: {
        host: "HOST",
        port: "PORT",
      },
    });
    // 加载本地database.rules.json文件中的规则
    await testEnv.loadRules({
      database: fs.readFileSync("./database.rules.json", "utf8"),
    });
  });

  it("should not allow read access to all users", async () => {
    const alice = testEnv.unauthenticatedContext();
    const db = alice.database("http://HOST:PORT/?ns=PROJECT_NAME");
    await assertFails(get(ref(db, "/users")));
  });
});

方式二:直接传入规则内容

在initializeTestEnvironment的配置中直接指定数据库规则:

import {
  assertFails,
  initializeTestEnvironment,
  RulesTestEnvironment,
} from "@firebase/rules-unit-testing";
import { describe, beforeEach, it } from "mocha";
import { ref, get } from "firebase/database";

describe("earth security rules tests", () => {
  let testEnv: RulesTestEnvironment;

  beforeEach(async () => {
    testEnv = await initializeTestEnvironment({
      projectId: "PROJECT_NAME",
      database: {
        host: "HOST",
        port: "PORT",
        // 直接传入规则配置
        rules: {
          ".write": "false",
          ".read": "false",
        },
      },
    });
  });

  it("should not allow read access to all users", async () => {
    const alice = testEnv.unauthenticatedContext();
    const db = alice.database("http://HOST:PORT/?ns=PROJECT_NAME");
    await assertFails(get(ref(db, "/users")));
  });
});

额外优化

你原代码中有一个未使用await的get请求,虽然不影响测试结果,但会导致控制台输出时机混乱,建议直接移除该代码块。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:32:39