gpt4 book ai didi

javascript - 我需要什么规则才能允许访问 Firestore 中的用户数据?

转载 作者:行者123 更新时间:2023-12-05 00:29:26 27 4
gpt4 key购买 nike

我正在学习 Firestore 并构建了一个 Angular 应用程序。我正在使用 Firebase 身份验证,并且无法确定用于允许用户访问其数据的规则。例如,一个产品集合,其中每个产品都有一个 userId,实际上是他们的电子邮件地址。
例子:
enter image description here
我目前的规则如下并且不起作用(我已经尝试了基于文档、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=**) 它将它向任何不是我想要的人开放。 :)
有任何想法吗?
编辑:如果有人想知道 Angular 代码。同样,如果我设置规则以允许任何事情,我确实可以取回数据。如果我限制它,到目前为止我什么也得不到。所以,我知道代码有效(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();
}
}

最佳答案

我认为构建的安全规则存在一些问题。您可以引用Firestore security rules要了解有关编写规则和测试规则的更多信息,您可以引用 documentation其中提到:

Cloud Firestore provides a rules simulator that you can use to testyour ruleset. You can access the simulator from the Rules tab in theCloud Firestore section of the Firebase console.The rules simulator lets you simulate authenticated andunauthenticated reads, writes, and deletes.


一)从 Firestore 数据库产品集合的屏幕截图中,文档 ID 似乎是一个自动生成的字母数字序列。因此,以下匹配规则将匹配 {userEmail} 和 {userId} 变量中的文档 ID(自动生成),而不是变量名称所暗示的用户电子邮件或用户 ID。
 match /users/{userEmail}
match /products/{userId}
您当然可以创建文档 ID 以具有电子邮件地址而不是自动生成的序列,在这种情况下,上述匹配条件可能会按预期工作。
b) request.auth.uid.userEmail的用法是不正确的。从用户的请求身份验证状态引用电子邮件的正确方法是 "request.auth.token.email" .您可以阅读 request.auth & resource variable references在 Firestore 公共(public)文档上 - documentation1 & documentation2使用正确的语法。
c) 以下是对安全规则的一些更正。这应该有效。
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userDocId} {
allow read, write: if request.auth != null;
}
match /products/{productDocId}{
allow read, write: if request.auth.token.email == resource.data.userId
}
}
}

关于javascript - 我需要什么规则才能允许访问 Firestore 中的用户数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70400710/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com