sla*_*ets 6 javascript firebase-security angularfire firebase-authentication google-cloud-firestore
我正在学习 Firestore 并构建了一个有角度的应用程序。我正在使用 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
}
}
}
Run Code Online (Sandbox Code Playgroud)
我所做的唯一有效的事情(即我拿回所有产品)是如果我进行 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();
}
}
Run Code Online (Sandbox Code Playgroud)
我认为构建的安全规则存在一些问题。您可以参考 Firestore 安全规则来了解有关编写规则的更多信息,并且要测试您的规则,您可以参考提到的文档:
Cloud Firestore 提供了一个规则模拟器,您可以用它来测试您的规则集。您可以从Firebase 控制台 Cloud Firestore 部分的“规则”选项卡访问模拟器。规则模拟器可让您模拟经过身份验证和未经身份验证的读取、写入和删除。
a)从 Firestore 数据库产品集合的屏幕截图中,文档 ID 似乎是自动生成的字母数字序列。因此,下面的匹配规则将匹配 {userEmail} 和 {userId} 变量中的文档 ID(自动生成),而不是如变量名称所示的用户电子邮件或用户 ID。
match /users/{userEmail}
match /products/{userId}
Run Code Online (Sandbox Code Playgroud)
当然,您可以创建文档 ID 以包含电子邮件地址,而不是自动生成的序列,在这种情况下,上述匹配条件可能会按预期工作。
b)的用法request.auth.uid.userEmail不正确。从用户的请求身份验证状态引用电子邮件的正确方法是"request.auth.token.email"。您可以阅读request.auth & resource variable referencesFirestore 上的公共文档 -文档 1和文档 2以使用正确的语法。
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
834 次 |
| 最近记录: |