You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Firestore安全规则配置求助:仅允许Firebase项目成员的Google认证用户访问数据

Firestore安全规则配置求助:仅允许Firebase项目成员的Google认证用户访问数据

嗨,我完全懂你的需求——想让只有Firebase项目里的成员(就是那些被你添加到Firebase控制台用户列表里的Google账号)才能访问Firestore数据,还不想手动一个个列邮箱对吧?你现在写的规则确实只能验证用户是Google认证的,但没办法限制到你的项目成员,所以得调整一下规则逻辑,给你两个可行的方案:


方案一:用自定义声明(推荐,无需额外维护集合)

这个方法是通过给项目成员的账号标记一个专属标识,然后在规则里检查这个标识:

  1. 首先,你需要用Firebase Admin SDK给所有项目成员添加一个自定义声明,比如is_project_member: true。如果成员不多,也可以直接在Firebase控制台的「Authentication」→「用户」页面,手动给每个用户添加这个自定义声明;如果成员较多,可以写个小脚本,或者通过IAM API批量获取项目成员后批量添加声明。
  2. 修改你的Firestore规则,加入对这个自定义声明的检查:
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents/{document=**} {
    allow read, write: if request.auth != null &&
      // 确保是Google认证用户
      request.auth.token.firebase.sign_in_provider == "google.com" &&
      // 检查是否是项目成员的自定义声明
      request.auth.token.is_project_member == true &&
      // 可选:确保用户邮箱已验证,提升安全性
      request.auth.token.email_verified == true;
  }
}

方案二:维护项目成员邮箱集合(适合动态管理成员)

如果需要经常添加/移除成员,或者不想用自定义声明,可以在Firestore里建一个专门存成员邮箱的集合:

  1. 创建一个名为project_members的集合,每个文档的ID直接用成员的邮箱地址(或者在文档里存email字段),不需要其他额外数据。
  2. 修改规则,检查当前用户的邮箱是否存在于这个集合中:
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents/{document=**} {
    allow read, write: if request.auth != null &&
      request.auth.token.firebase.sign_in_provider == "google.com" &&
      request.auth.token.email_verified == true &&
      // 检查用户邮箱是否在项目成员集合里
      exists(/databases/$(database)/documents/project_members/$(request.auth.token.email));
  }
}

为什么你原来的规则不行呢?因为request.auth.token.firebase.identities["google.com"] != null只是验证了用户是通过Google账号登录的,但任何有Google账号的人都能通过这个验证,根本没关联到你的Firebase项目成员身份。上面两个方案都能帮你把访问权限限制到你的项目内部成员,而且不用手动在规则里列一堆邮箱~

备注:内容来源于stack exchange,提问作者jlblca9l_kpblca

火山引擎 最新活动