Firebase Cloud Firestore 规则/权限问题

时间:2021-03-16 07:21:19

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

我正在尝试设置权限,以便具有给定电子邮件地址的用户只能阅读具有匹配 docId 的文档。

这是文档的集合:

/cats/a@test.com
/cats/b@test.com
/cats/c@test.com

以下内容在“规则游乐场”中完美运行,但最终在我的 Angular 应用程序中始终没有返回任何内容。

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    match /cats/{catDocId} {
      allow read: if request.auth.token.email.lower() == catDocId;
      allow write: if false;
    }

  }
}

这是应用程序代码:

myPage.component.ts:

import { AngularFireAuth } from '@angular/fire/auth';
import { AngularFirestore } from '@angular/fire/firestore';
import { Observable } from 'rxjs';

// ...

cats: Observable<any[]>;

// ...

ngOnInit(): void {
    this.afAuth.authState.subscribe(user => {
        this.cats = this.firestore.collection('cats').valueChanges();
    });
}

myPage.component.html:

<ul>
    <li class="text" *ngFor="let cat of cats | async">
        {{cat.name}}, {{cat.color}}, {{cat.favoriteFood}}
    </li>
</ul>

任何想法这是哪里出了问题?谢谢。

1 个答案:

答案 0 :(得分:1)

来自您的评论:

<块引用>

所以看来我正在尝试使用规则作为过滤器。有没有简单的 根据用户的令牌授予对单个文档的读取访问权限的方法 数据,即他们的电子邮件地址?

您只需要使用 User 对象即可获取用户的电子邮件。我不是很精通 angularfire,但以下代码(来自 angularfire doc on Authentication)显示了如何获取 displayName 属性。您应该对 email 属性执行相同的操作。然后您应该直接查询文档,如 here 所述,因为您拥有整个 DocumentReference

import { Component } from '@angular/core';
import { AngularFireAuth } from '@angular/fire/auth';
import firebase from 'firebase/app';

@Component({
  selector: 'app-root',
  template: `
    <div *ngIf="auth.user | async as user; else showLogin">
      <h1>Hello {{ user.displayName }}!</h1>
      <button (click)="logout()">Logout</button>
    </div>
    <ng-template #showLogin>
      <p>Please login.</p>
      <button (click)="login()">Login with Google</button>
    </ng-template>
  `,
})
export class AppComponent {
  constructor(public auth: AngularFireAuth) {
  }
  login() {
    this.auth.signInWithPopup(new firebase.auth.GoogleAuthProvider());
  }
  logout() {
    this.auth.signOut();
  }
}
相关问题