Firestore安全规则 - 在创建时,检查属性不在另一个文档中

时间:2018-04-24 13:34:21

标签: javascript firebase google-cloud-firestore firebase-security-rules

我正在使用firestore,并且用户包含名为domain的属性:

{ 
    domain: "@domain.com"
}

我目前正在使用云功能在注册时为用户生成随机域。云功能查询数据库以检查随机域是否已经存在,这会导致几秒钟的延迟。

我的问题是,如果另一个用户已经存在来自Firestore安全规则的域,而不必查询整个数据库,是否有办法防止插入新用户?

到目前为止,我已尝试将此添加到我的安全规则中,但它允许重复:

match /databases/{database}/documents {
    match /users/{Id} {
    allow read: if true;
    allow create: if get(/databases/$(database)/documents/users/$(Id)).data.domain != request.resource.data.domain;
  }
}

只知道使用安全规则是否可行?

1 个答案:

答案 0 :(得分:1)

您无法检查集合中任何其他文档中是否已存在集合。如果你认为它有一段时间是有意义的 - 这样的操作会非常昂贵。

可以做的是检查集合中是否已存在具有特定ID的文档。针对您的问题类型的典型解决方案是创建一个使用域作为ID的集合。

E.g。

users
  user1: { domain: "@domain.com" }
  user2: { domain: "@other.com" }
domains
  "domain.com": "user1"
  "other.com": "user2"

现在,您的安全规则可以检查该域名是否已在/domains集合中声明。

请注意,您希望使用batched write来执行更新,因为此方法中/users/domains必须始终保持同步。