firebase 如何在Swift应用中设置cloud firestore规则来检查用户名的唯一性

wrrgggsh  于 2023-04-12  发布在  Swift
关注(0)|答案(1)|浏览(209)

在firestore规则中,我允许未授权用户进行读访问,以便在允许用户注册之前检查用户名的唯一性。这一更改导致我的Firebase数据库具有较低的安全性,因为任何用户都可以读取我的整个数据库。2我如何授予未授权的用户仅对我的“用户”中的用户名变量具有读取访问权限收集在firestore交叉检查他们想要的用户名与现有的用户名?我想保证我的安全不受损害。
所有用户数据都在我的名为“用户”的集合中,该集合包含与特定用户ID相关的所有用户数据。我的数据库中还有6个其他集合(事件,匹配,最近,消息,键入,喜欢),我不希望任何未经授权的用户读取或写入。

我将所需的用户名作为变量“field”传递给此函数,以检查用户名的可用性:

func checkUsername(field: String, completion: @escaping (Bool) -> Void) {
        print("ok")
        var query: Query!
        print(field)
        query = FirebaseReference(.User).whereField(kUSERNAME, isEqualTo: field)
        if query != nil {
            
            query.getDocuments { (snapShot, error) in
                if let err = error {
                    print("Error getting document: \(err)")
                }
                
                guard let snapshot = snapShot else
                {
                    print("empty snapshot")
                    return
                }
               
                if !snapshot.isEmpty {
                    print("not empty")
                    for document in snapshot.documents  {
                        if document.data()["username"] != nil {
                            completion(true)
                        }
                    }
                
                    
                } else {
                    print("empty snapshot")
                    completion(false)
                }
                
            }
            
        } else {
            completion(false)
        }
        
  
        
    }

我目前的规则是工作,但我的安全受到损害。我想要一种方法,使这一工作,而不损害安全。

8i9zcol2

8i9zcol21#

Firebase安全规则在文档级别提供/拒绝访问。无法仅提供对每个文档中特定字段的访问。
为了安全地强制唯一用户名,您需要引入一个额外的集合,该集合使用用户名作为键,并且通常仅将声称该名称的用户的UID作为其唯一字段。
在这个集合上,您可以提供粒度访问,即只允许特定文档上的get,而不是集合中所有文档的list(也不是read)。
有关此方面的更多信息,请参阅:

相关问题