Firestore 安全规则:允许访问一个特定用户

时间:2021-01-03 18:55:16

标签: firebase google-cloud-firestore firebase-authentication firebase-security

我有一个生产和沙箱 Firestore 数据库以及一个通用的 firestore.rules 文件。
我希望每个数据库只允许一个用户进行读写。

我目前将此配置用于安全规则

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
  
    function isAdmin(uid) {
      return uid == "IKHXrLmfIFZvrimpJUwnfUzTUoE2" 
      || uid == "xVTByGu49XX3rOdNYMKf2Bzt5bY2";
    }
    
    match /{document=**} {
      allow read, write: if isAdmin(request.auth.uid)
    }
  }
}

第一个uid是demo用户(只存在于sandbox firebase项目中),第二个是生产数据库的admin用户(只存在于生产项目中)

详情:

  • 代码库是开放的
  • 沙盒数据库具有公共 API 密钥和演示用户凭据(免费计划)。
  • 生产数据库是私有的,API 密钥和管理员凭据受到保护。

我知道发布沙盒 API 密钥不是最好的,但它不是一个重要的数据库。
重要的是生产数据库保持安全。

使用这种方法有什么安全问题吗? 如果是,如何保护生产数据库?

1 个答案:

答案 0 :(得分:1)

当我第一次开始一个项目时,我一直使用这种方法。我创建了一个初始(匿名)用户,并在安全规则中授予该用户广泛的权限。

由于您需要项目的服务凭据才能在我的项目上随意设置相同的 UID,因此这种方法是安全的,可以让我快速上手。

然后,当我准备好使用更广泛的安全系统时,我会扩展安全模型,通常是以下之一:

  1. 允许来自特定域的所有用户进行管理访问。
  2. 通过在数据库中创建管理员 UID 列表,并在我的规则中进行检查。
  3. 通过向用户的令牌添加自定义声明 isAdmin,并在安全规则中进行检查。

但即使到那时,我还是倾向于保留硬编码的 UID,因为它们没有安全风险。