首页 > 解决方案 > 如何使这些安全规则对 Firestore 满意

问题描述

因此,当我在应用商店上启动该应用时,我的安全规则开始出现权限问题,我试图找到一种解决方案,让 Firestore 不再每天向我发送电子邮件。这成为问题的功能是学生用户在我的应用程序中注册时。

因此,当用户注册时,我有一个用于验证的回调函数,当学生用户点击注册按钮时我会使用它:

  func determineIfIDIsValid(isIDValidCallback: @escaping (Bool) -> ()) {
    guard let schoolIDText = studentSchoolIDTextField.text else { return }
    db.collection("school_users").whereField("school_id", isEqualTo: schoolIDText).getDocuments { (querySnapshot, error) in
        guard error == nil else { return }
        guard let query = querySnapshot?.isEmpty else { return }
        if query == true {
            self.showAlert(title: "No School ID Found", message: "There is currently no School associated with the School ID you input. Please re-enter a valid School ID.")
            isIDValidCallback(false)
        } else {
            isIDValidCallback(true)
            return
        }
    }
}

这会在用户通过身份验证之前读取 Firestore,这就是导致我的安全规则出现问题的原因。我最终将其更改为完全不安全的规则,以查看它是否有效并且确实有效,但我不希望 Firestore 每天都发送电子邮件,所以我现在想解决这个问题。

这些是我让它工作的规则,但不安全:

rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
  allow write: if request.auth != null;
  allow read: if true; 
  }
 }
}

然后今天我决定尝试让它更安全一点:

rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
  allow write, read: if request.auth != null;
}
match /school_users/{userID} {
    allow read: if resource.data.visibility == 'public'; 
}
}
}

现在,我认为这会起作用,这是我的数据库和文档中的路径:

数据库

当我在规则游乐场和 iOS 模拟器中尝试这些规则时,它仍然无法按我的预期工作,并且我得到resource一个空值错误,这对我来说不太有意义,因为文档路径确实存在. 关于如何使这些规则生效并满足 Firestore 标准的任何建议?

标签: swiftfirebasegoogle-cloud-firestorefirebase-authenticationfirebase-security

解决方案


推荐阅读