我正在尝试设置权限,以便具有给定电子邮件地址的用户只能阅读具有匹配 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>
任何想法这是哪里出了问题?谢谢。
答案 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();
}
}