是否可以在读取操作中将数据传递到 Firestore 以检查读取操作是否正确。根据 'security rules' 中的数据是否允许?
Is it possible to pass data to Firestore within a read-operation to check if the read-op. is allowed based on that data in 'security rules'?
我想根据安全存储在 Firestore 中的正确答案检查用户的给定答案。首先,我想我可以检查是否存在具有用户 givenAnswer 的文档,但是通过像这样迭代集合来获取所有文档 ID 及其字段非常容易:
db.doc(`quizzes/quiz1`).collection('question1').get().then((querySnapshot) => {
querySnapshot.forEach((doc) => {
console.log('doc.id: ' , doc.id)
console.log('doc.data: ' , doc.data())
})
})
我可以想象通过首先将 givenAnswer 写入特定 userDocument 中的 Firestore 并随后检查安全规则中的读取操作来实现我的需要,如果这个值与 correctAnswer 相同,但它会花费额外的写操作...
所以我认为必须有一种方法可以在读取操作中传递 givenAnswer 并在 givenAnswer 和 correctAnswer 匹配时检查安全规则。
阅读有关为用户创建自定义令牌的信息,但我不确定这是否可行(我不知道这些令牌如何工作...),因为有必要更改自定义的值每次尝试比较 givenAnswer 时的标记。
希望有人对我正在尝试做的事情有解决方案
非常感谢!
我认为 read
Firestore 规则的操作中没有类似的东西。使用 writing
操作,您可以只使用您写入的数据来检查。
我可以想象您可以使用两种解决方案。两者都包含 firebase 云函数:
1 - 当您的用户将答案写到 firestore 时,只需使用云功能来检查它是否正确,并将它们标记为正确或错误。这样就没有用户需要访问答案。
2 - 如果您想检查答案是否正确,请使用可调用的云函数来调用它们。您只需发送答案,它会回复您是否正确。
客户端用户无法更改他的自定义声明。它们存储在授权令牌中。您仍然需要调用云函数来设置或更新它们。
我不确定我是否完全理解你的数据库结构,但假设你将所有答案存储在某个单独的集合中,并且答案包含 link 或对原始问题的引用(比如questionID),您可以 运行 一个复合查询来匹配两者:
db.collection('answers').where("questionID","==",givenQuestionID).where("correctAnswer","==",givenAnwser)
如果您没有收到任何结果,则表示答案不正确。与每次拉取整个集合相比,这在数据库读取上要便宜得多。如果您有多个想要接受的答案,可以将这些答案存储在一个数组中并使用 array_contains
查询来查看 givenAnswer 是否与任何已批准的答案相匹配。
您可以在此处详细了解不同的查询选项:
https://firebase.google.com/docs/firestore/query-data/queries#simple_queries
我想根据安全存储在 Firestore 中的正确答案检查用户的给定答案。首先,我想我可以检查是否存在具有用户 givenAnswer 的文档,但是通过像这样迭代集合来获取所有文档 ID 及其字段非常容易:
db.doc(`quizzes/quiz1`).collection('question1').get().then((querySnapshot) => {
querySnapshot.forEach((doc) => {
console.log('doc.id: ' , doc.id)
console.log('doc.data: ' , doc.data())
})
})
我可以想象通过首先将 givenAnswer 写入特定 userDocument 中的 Firestore 并随后检查安全规则中的读取操作来实现我的需要,如果这个值与 correctAnswer 相同,但它会花费额外的写操作...
所以我认为必须有一种方法可以在读取操作中传递 givenAnswer 并在 givenAnswer 和 correctAnswer 匹配时检查安全规则。
阅读有关为用户创建自定义令牌的信息,但我不确定这是否可行(我不知道这些令牌如何工作...),因为有必要更改自定义的值每次尝试比较 givenAnswer 时的标记。
希望有人对我正在尝试做的事情有解决方案
非常感谢!
我认为 read
Firestore 规则的操作中没有类似的东西。使用 writing
操作,您可以只使用您写入的数据来检查。
我可以想象您可以使用两种解决方案。两者都包含 firebase 云函数:
1 - 当您的用户将答案写到 firestore 时,只需使用云功能来检查它是否正确,并将它们标记为正确或错误。这样就没有用户需要访问答案。
2 - 如果您想检查答案是否正确,请使用可调用的云函数来调用它们。您只需发送答案,它会回复您是否正确。
客户端用户无法更改他的自定义声明。它们存储在授权令牌中。您仍然需要调用云函数来设置或更新它们。
我不确定我是否完全理解你的数据库结构,但假设你将所有答案存储在某个单独的集合中,并且答案包含 link 或对原始问题的引用(比如questionID),您可以 运行 一个复合查询来匹配两者:
db.collection('answers').where("questionID","==",givenQuestionID).where("correctAnswer","==",givenAnwser)
如果您没有收到任何结果,则表示答案不正确。与每次拉取整个集合相比,这在数据库读取上要便宜得多。如果您有多个想要接受的答案,可以将这些答案存储在一个数组中并使用 array_contains
查询来查看 givenAnswer 是否与任何已批准的答案相匹配。
您可以在此处详细了解不同的查询选项: https://firebase.google.com/docs/firestore/query-data/queries#simple_queries