首页 > 解决方案 > Firestore 安全规则:在获取查询时检查用户输入

问题描述

我正在用 Firestore 创建一个博客。我有两个名为usersand的集合blogPostsblogPosts包含namecreatedAt和(纯字符串)字段中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.dataread

如何使用 Firebase 安全规则实现我的目标,以便只有拥有blogPosts密码的客户端才能访问文档?

标签: firebasegoogle-cloud-firestorefirebase-security

解决方案


您尝试做的事情对于安全规则是不可能的(而且根本不是真正的“安全”)。客户端应用程序不能简单地在查询中传递一些密码。检查输入的唯一时间是写入操作中的文档字段,而不是文档读取。

如果要检查密码,则必须创建某种 API 端点并要求调用者提供该端点的密码。同样,请记住,这与您将密码保密的能力一样安全,因为一旦它被知道(可能通过简单地对您的应用程序进行逆向工程),任何人都可以使用它。


推荐阅读