【发布时间】:2018-09-01 22:46:57
【问题描述】:
我有点卡在这里,因为无法调试这些规则。我会感谢以下规则的帮助。
我想访问:
/modules/module-id/sessions/session-id/parts/
hasCompletedPrerequisiteSession()第一部分与null的比较效果很好,第二部分不行!
路径/modules/moduleId/sessions/sessionId/prerequisite 指向一个引用字段。
service cloud.firestore {
match /databases/{database}/documents {
function hasCompletedPrerequisiteSession(moduleId,sessionId) {
// this part works well
return getPrerequisiteSession(moduleId,sessionId) == null ||
// !!! this part does not work !!!
hasCompleted(getPrerequisiteSession(moduleId,sessionId).id);
}
function getPrerequisiteSession(moduleId,sessionId) {
return get(/databases/$(database)/documents/modules/$(moduleId)/sessions/$(sessionId)).data.prerequisite;
}
function hasCompleted(sessionId) {
return exists(/databases/$(database)/documents/progress/$(request.auth.uid)/sessions/$(sessionId));
}
match /modules/{moduleId}/sessions/{sessionId}/parts/{partId} {
allow read: if hasCompletedPrerequisiteSession(moduleId,sessionId);
}
}
}
(如果我将会话 ID 存储为字符串而不是对会话的引用,则可以正常工作。)
编辑
问题
-
安全规则中的引用字段。假设
modules/moduleId/owner指向reference类型的字段。获取引用文档 id 的正确方法是什么?get(../modules/moduleId).data.owner.data.id或get(../modules/moduleId).data.owner或其他?
【问题讨论】:
-
谢谢@ToniTornado,这没用。我在上面添加了一个问题。你能回答吗?
-
我们需要知道您的查询对您没有帮助。在获取数据之前,会根据安全规则对查询进行评估。
-
我想访问
/modules/module-id/sessions/session-id/parts/。顺便说一句,如果我将会话 ID 存储为字符串而不是对会话的引用,它可以正常工作。
标签: firebase google-cloud-firestore firebase-security