javascript - Angular FirebaseError 缺少或权限不足
问题描述
我试图允许每个用户使用 firestore 读取和写入他们自己的数据,但是我收到了权限不足的错误。我不确定为什么。
我的火库有这些规则......
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{uid} {
allow create: if request.auth != null;
allow read, write, update, delete: if request.auth != null && request.auth.uid == uid;
}
}
}
在我的项目中,我的服务使用以下函数将数据推送到 angular firebase(是的,它很长)......
constructor(private afs: AngularFirestore){}
addToOrders(artist: string, formInput: AlbumInput) {
const currentUser = this.authService.currentUser; // uses a getter function to obtain the current user
const trackingUrl = 'https://tools.usps.com/go/TrackConfirmAction_input?strOrigTrackNum=';
const newOrder: Order = {
artistName: artist,
album: formInput.selectedAlbum.name,
image: formInput.selectedAlbum.images[0].url,
orderType: formInput.orderType,
trackingUrl: trackingUrl,
variant: formInput.variant
}
if (formInput.orderType === "shipped") {
newOrder.trackingNum = formInput.trackingNum;
return of(this.afs.doc(`users/${currentUser.uid}`).collection('shipped').add(newOrder))
.subscribe({
next: (() => {
this.albumAdded$.next(true);
}),
error: (() => {
this.albumAdded$.next(false);
})
});
} else {
newOrder.date = formInput.date;
return of(this.afs.doc(`users/${currentUser.uid}`).collection('preordered').add(newOrder))
.subscribe({
next: (() => {
this.albumAdded$.next(true);
}),
error: (() => {
this.albumAdded$.next(false);
})
});
}
}
我在这种模式中是否缺少任何会导致此类错误的东西?
如果我将规则更改为users/${user=**},它确实将数据成功存储到用户子集合中,但是现在我无法正常登录(由于某种原因,尽管方法差不多,但我仍然可以注册完全相同的)。这是我的登录...
signIn(signInForm: SignInForm) {
return this.afAuth.signInWithEmailAndPassword(signInForm.email, signInForm.password)
.then((result) => {
this.isUserData.next(true);
this.setUserData(result.user!)
.then(() => {
this.router.navigateByUrl("/home");
});
}).catch(error => {
this.errorModal(error); // Modal Generic launches to inform the user
});
}
设置用户数据...
setUserData(user: User) {
const userRef: AngularFirestoreDocument<any> = this.afs.doc(`users/${user.uid}`);
const userData: User = {
uid: user.uid,
email: user.email,
displayName: user.displayName
}
return userRef.set(userData, {
merge: true
});
}
解决方案
这条规则:
match /users/{uid} {
允许用户阅读他们自己的配置文件。它不允许他们读取那里的子集合,这是您在此代码中所做的:
of(this.afs.doc(`users/${currentUser.uid}`).collection('shipped').add(newOrder))
要允许用户同时读取其个人资料文档的所有子集合,请使用递归通配符( **
):
match /users/{uid=**} {
推荐阅读
- parameters - Modelica 中参数的 FMU 输入
- python - 如何检查和比较元组项
- android - FCM 服务器如何识别网络上的目标设备?
- python - 使用 Flask 显示 matplotlib 图
- javascript - 如何将模板提取到外部文件
- python - 日出的Python星体计算,两个不同的时间相同的日期
- python-asyncio - ConnectionResetError('连接丢失')python异步服务器
- authentication - Web 浏览器绕过 Istio 的最终用户身份验证
- laravel - 具有多个参数的 Laravel 路由不起作用
- jquery - 选择两个日期之间的列数据和时间