在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)
}
}
我目前的规则是工作,但我的安全受到损害。我想要一种方法,使这一工作,而不损害安全。
1条答案
按热度按时间8i9zcol21#
Firebase安全规则在文档级别提供/拒绝访问。无法仅提供对每个文档中特定字段的访问。
为了安全地强制唯一用户名,您需要引入一个额外的集合,该集合使用用户名作为键,并且通常仅将声称该名称的用户的UID作为其唯一字段。
在这个集合上,您可以提供粒度访问,即只允许特定文档上的
get
,而不是集合中所有文档的list
(也不是read
)。有关此方面的更多信息,请参阅: