firebase - Firestore 安全规则:在获取查询时检查用户输入
问题描述
我正在用 Firestore 创建一个博客。我有两个名为users
and的集合blogPosts
。blogPosts
包含name
、createdAt
和(纯字符串)字段中createdBy
的每个文档。password
我想创建一个安全规则,以便客户只有在提供正确的文档时才能访问文档password
。
根据这个链接中的一个想法,我写了一个这样的规则:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /blogPosts/{postUid} {
allow write: if
request.resource.data.createdBy == request.auth.uid &&
request.resource.data.name is string &&
request.resource.data.name.size() > 2 &&
request.resource.data.name.size() < 32 &&
request.resource.data.password is string &&
request.resource.data.password.size() > 5 &&
request.resource.data.password.size() < 32
allow read: if
request.auth != null &&
request.resource.data.password == resource.data.password // <---- THIS LINE IS NOT WORKING
}
}
}
我在上面的规则中得到了这个错误:Error: simulator.rules line [16], column [8]. Property resource is undefined on object.
所以这意味着我们没有查询。resource.data
read
如何使用 Firebase 安全规则实现我的目标,以便只有拥有blogPosts
密码的客户端才能访问文档?
解决方案
您尝试做的事情对于安全规则是不可能的(而且根本不是真正的“安全”)。客户端应用程序不能简单地在查询中传递一些密码。检查输入的唯一时间是写入操作中的文档字段,而不是文档读取。
如果要检查密码,则必须创建某种 API 端点并要求调用者提供该端点的密码。同样,请记住,这与您将密码保密的能力一样安全,因为一旦它被知道(可能通过简单地对您的应用程序进行逆向工程),任何人都可以使用它。
推荐阅读
- java - 对象渲染到 Json - Spring Boot
- json - 如何在颤动中解析来自 websocket 服务器的 json 数据?
- phpspreadsheet - PhpSpreadsheet 条件格式(平方)
- ethereum - 在solidity中使用结构内部的映射
- extjs - 右对齐按钮
- php - 严格的类型声明和资源
- python - 为什么这个输入不通过这个简单的 PyTorch 模型?
- sql - 过滤 WHERE datetime column = 'mm/dd/yyyy' without time 不会返回记录
- javascript - 使用 javascript 切换类
- python - Python - 具有多个 for 循环的多处理