firebase - Firestore 规则获取始终为空或出错
问题描述
它是关于 isAllowedWorkDayLocationData (检查 user-document.teamId 和 WorkDayLocationData.teamId 是否相同) - 全局读取似乎工作正常,并且 users{users} 似乎工作。
我尝试比较访问文档的属性 .teamId 和请求者 /users/-Document .teamId。
不知何故,它总是返回错误或错误,我不确定两者中的哪一个......我检查了两个文档并给出了teamId。
rules_version = '2';
service cloud.firestore {
function isAllowedWorkDayLocationData(docId, userUid) {
return
get(/databases/{database}/documents/users/$(userUid)).data.teamId ==
get(/databases/{database}/documents/workDayLocationDatas/$(docId)).data.teamId;
}
match /databases/{database}/documents {
match /{document=**} {
allow read;
}
match /workDayLocationDatas/{docId} {
allow write: if isAllowedWorkDayLocationData(docId, request.auth.uid);
}
match /users/{user} {
allow write: if request.auth.uid != null;
}
}
}
这是我来自 Angular 应用程序的查询(在我实施规则之前一直有效)
this.afStore.collection<WorkDayLocationData>('workDayLocationDatas', ref => ref
.where('teamId', '==', this.teamId)
.where('locationId', '==', this.locationId)
.where('date', '==', this.helpers.toFireStoreDate(this.workDay.date))
.limit(1))
.snapshotChanges()
.pipe(first())
.subscribe((actions: DocumentChangeAction<WorkDayLocationData>[]) => {
console.log("i did something");
const data = actions[0].payload.doc.data() as WorkDayLocationData;
const id = actions[0].payload.doc.id;
const newPersonUids = [...data.slotsPersonUids, user.uid];
this.afStore.collection<WorkDayLocationData>('workDayLocationDatas')
.doc(id)
.update({
slotsUsed: newPersonUids.length,
slotsPersonUids: newPersonUids
});
});
});
属性的 WorkDayLocationData 接口:
export interface WorkDayLocationData {
date: string;
locationId: string;
locationName: string;
teamId: string;
slotsUsed: number;
maxSlots: number;
slotsPersonUids: string[];
}
解决方案
function isAllowedWorkDayLocationData(docId, userUid) {
return
get(/databases/{database}/documents/users/$(userUid)).data.teamId ==
get(/databases/{database}/documents/workDayLocationDatas/$(docId)).data.teamId;
}
所以事实证明 {database} 应该是 $(database) ,因此该函数的正确代码如下所示:
function isAllowedWorkDayLocationData(docId, userUid) {
return
get(/databases/$(database)/documents/users/$(userUid)).data.teamId ==
get(/databases/$(database)/documents/workDayLocationDatas/$(docId)).data.teamId;
}
推荐阅读
- jquery - 从 document.location.href 获取完整的 URL 查询字符串?
- docker - Julia - 随机包的 Pkg.add() 期间出错
- php - 从下拉列表中获取值后动态填充字段
- mongodb - MongoDB(带有相关字段的文本搜索)聚合问题
- php - PHP获取SQL - 行中的双记录
- java - 无法将 java.lang.String 类型的对象转换为类型 In DatabaseReference
- typescript - 使用扩展语法以创建对象的新实例时如何删除对象的属性?
- java - 休息可以 MediaType.MULTIPART_FORM_DATA 与 @Produces 一起使用
- node.js - 客户端-服务器 websocket
- r - 基于使用函数的某些计算在数据框中创建附加列时出错