繁体   English   中英

Firestore 安全规则:如何确保文档中值的唯一性?

[英]Firestore security rule: How to ensure uniqueness of values in document?

在配置文件集合中创建文档之前,以下安全规则能否确保名字、姓氏、用户名和电子邮件的唯一性?

match /profiles/{document=**} {
   allow create: if request.auth.uid != null
   && (request.resource.data.firstName is string && resource.data.firstName != request.resource.data.firstName)
   && (request.resource.data.lastName is string && resource.data.firstName != request.resource.data.firstName)
  && (request.resource.data.username is string && resource.data.username != request.resource.data.username)
  && (request.resource.data.email is string && resource.data.email != request.resource.data.email)
}

例如,下面是 Firestore collection profiles 中的数据

{
   "document1":{
      "firstName":"Jek",
      "lastName":"Choo",
      "email":"jeksomething@gmail.com",
      "username":"jek"
   },
   "document2":{
      "firstName":"Cara",
      "lastName":"Choo",
      "email":"babycara@gmail.com",
      "username":"cara"
   }
}

我想创建以下新文档,应该拒绝此创建访问

{
   "document3":{
      "firstName":"Jek",
      "lastName":"Choo",
      "email":"jeksomething@gmail.com",
      "username":"jek"
   }
}

我想创建下面的新文档,这应该是允许的。

{
   "document4":{
      "firstName":"example",
      "lastName":"com",
      "email":"test@example.com",
      "username":"example"
   }
}

综上所述,上面的firestore安全规则能否在允许创建文档之前帮助确保字段值的唯一性?

重要的是要了解resource在创建新文档的规则方面的作用,这是您在此处显示的唯一规则。

resource是指“正在编写的(现有)文档”。 这与 request.resource 形成对比, request.resource描述尚不存在的文档,如果写入成功则即将存在。

换句话说, 在本节中

resource 变量指的是请求的文档,resource.data 是存储在文档中的所有字段和值的映射。

在创建的情况下,没有正在写入的现有文档。 因此,您可以假设任何与resource的匹配都会失败。 因此,这不能确保唯一性。

事实上,您无法确保创建的任何给定文档字段的唯一性,因为在安全规则中不可能查询集合中的所有文档是否存在该字段。

Firestore 观察到的唯一形式是集合中文档的 ID。 该文档的所有字段都不能被安全规则限制为唯一,并且 Firestore 中没有索引可以确保唯一性。

如果你需要一个字段是唯一的,你应该文档创建后使用Cloud Function trigger进行检查,如果不满足要求则删除文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM