Firebase规则-通过电子邮件地址将文档与用户匹配

时间:2018-11-12 19:28:01

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

我正在尝试一个简单的规则:如果我的records集合中的文档包含与登录用户的电子邮件匹配的电子邮件(fatherEmail || motherEmail),请允许该文档被阅读。无法正常工作-Missing or insufficient permissions

这是我的规则: Cloud Firestore Rules

每种Firebase技术支持均建议使用一种方法来检索经过身份验证的用户的电子邮件地址:

function getUserEmail(){ return request.auth.token.email; }

这是Stackblitz: https://stackblitz.com/edit/login-and-match-record-mvce?file=src%2Fapp%2Fauth.service.ts

使用经过验证的电子邮件登录: 用户: devcore2911@gmail.com 通过: foobar 如果您查看控制台,将会看到我上面提到的错误。

我的records集合包含一个文档,该文档包含devcore2911@gmail.com作为fatherEmail属性的值,因此文档应该上拉: Matching Doc

1 个答案:

答案 0 :(得分:0)

解决方案:我必须执行查询以过滤出与用户电子邮件匹配的文档。

请参阅此堆叠闪电战:https://stackblitz.com/edit/login-and-match-record-mvce?file=src%2Fapp%2Frecord-list%2Frecord-list.component.ts

这是解决问题的代码。请注意,由于Firebase查询不支持combineLatest运算符,因此使用||

const matchFatherEmail = this.afs.collection("records", ref => ref.where("fatherEmail","==", this.authService.user.email));
const matchMotherEmail = this.afs.collection("records", ref => ref.where("motherEmail","==", this.authService.user.email));

this.records$ = combineLatest(matchFatherEmail.valueChanges(), matchMotherEmail.valueChanges())
  .pipe(switchMap(docs => {
    const [docsFatherEmail, docsMotherEmail] = docs;
    const combined = docsFatherEmail.concat(docsMotherEmail);
    return of(combined);
  }))