【发布时间】:2022-01-20 19:47:09
【问题描述】:
我正在学习 Firestore,并构建了一个 Angular 应用程序。我正在使用 Firebase 身份验证,并且无法确定用于允许用户访问其数据的规则。因此,例如一个产品集合,其中每个产品都有一个 userId,这实际上是他们的电子邮件地址。
我的当前规则如下并且不起作用(我已经尝试了基于文档、stackoverflow 等我能想到的一切):
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userEmail} {
allow read, write: if request.auth != null;
}
match /products/{userId}{
allow read, write: if request.auth.uid.userEmail == userId
}
}
}
我所做的唯一有效的事情(即我拿回所有产品)是如果我做一个 match/{document=**) 它将它向任何不是我想要的人开放。 :)
有什么想法吗?
编辑:如果有人想知道角度代码。同样,如果我设置规则以允许任何事情,我确实可以取回数据。如果我限制它,到目前为止我什么也得不到。所以,我知道代码有效(getAll),因此它一定是规则不对。
编辑:在从商店请求所有产品数据之前,我更新了代码以将用户电子邮件写入控制台。它成功输出了用户的电子邮件。
import { Injectable } from '@angular/core';
import { AngularFirestore, AngularFirestoreCollection } from '@angular/fire/firestore';
import { AngularFireAuth } from '@angular/fire/auth';
import { Product } from '../models/product.model';
@Injectable({
providedIn: 'root'
})
export class ProductsService {
private dbPath = '/products';
productsRef: AngularFirestoreCollection<Product>;
constructor(public afAuth: AngularFireAuth, private db: AngularFirestore) {
this.productsRef = db.collection(this.dbPath);
}
getAll(): AngularFirestoreCollection<Product>{
this.afAuth.authState.subscribe(user => {
console.log('Dashboard: user', user);
if (user) {
let emailLower = user.email.toLowerCase();
console.log("Email: " + emailLower);
}
});
return this.productsRef;
}
create(product: Product): any {
return this.productsRef.add(product);
}
update(id: string, data: any): Promise<void>{
return this.productsRef.doc(id).update(data);
}
delete(id: string): Promise<void> {
return this.productsRef.doc(id).delete();
}
}
【问题讨论】:
-
安全规则本身没有任何作用。请编辑您的问题,以包含与这些规则不符合您预期的代码。
-
@FrankvanPuffelen 起初我不明白,因为这些规则是代码,但重读了您的评论,我发布了调用 firebase 的角度代码。
-
我的猜测是,当用户尚未登录时,您正在访问数据库。在访问数据库之前,尝试在代码中记录用户的 UID。
-
@FrankvanPuffelen 好的,我添加了登录用户电子邮件的日志记录,它运行良好。在请求所有数据之前按预期打印。
标签: javascript google-cloud-firestore firebase-authentication firebase-security angularfire