安卓 | Firestore 规则 |检查用户名和电话是不是已经存在
Posted
技术标签:
【中文标题】安卓 | Firestore 规则 |检查用户名和电话是不是已经存在【英文标题】:Android | Firestore Rules | Check if username & phone already exists安卓 | Firestore 规则 |检查用户名和电话是否已经存在 【发布时间】:2021-10-27 21:18:16 【问题描述】:我想检查用户的用户名和电话号码是否唯一。我已经使用
FirebaseFirestore.getInstance().collection("Users").whereEqualTo("phone",ph).get().addOnCompleteListener(...);
这是我的 Firestore 规则:
service cloud.firestore
match /databases/database/documents
match /document=**
allow read: true;
allow write: if request.auth.uid != null;
match /Users/userID
allow update: if request.auth.uid == userID
&& (request.resource.data.username == resource.data.username
|| isUserNameAvailable(request.resource.data.username)
);
代码运行良好,没有问题。我在 signInWithCredential
方法之前检查这个,因此 request.auth.uid 将始终为空。要使代码正常工作,必须保留allow read: true;
但是,现在我收到了这个警告
我们检测到您的安全规则存在以下问题: 任何用户都可以读取您的整个数据库
有什么办法可以防止这种情况发生吗?
【问题讨论】:
【参考方案1】:这是开发人员在使用usernames
时常犯的错误。您授予任何人读取整个数据库的权限。即使您设法将其设置为仅读取Users
,任何人都可以读取您的所有用户数据。
我建议删除第一个 allow read:true
并为每个路径编写应有的规则。还为用户名创建一个单独的collection
,并将它们全部保存在那里,如/usernames/$username
和/phones/$phone
。如果需要一起保存可以这样做。
这样,您无需任何查询即可轻松检查 username
或 phone
是否存在,只需检查该路径是否存在于您的数据库中。
您可以非常轻松地将users
集合与这两个集合同步,甚至编写安全规则来防止在集合中创建用户名集合中已存在username
的用户。
【讨论】:
以上是关于安卓 | Firestore 规则 |检查用户名和电话是不是已经存在的主要内容,如果未能解决你的问题,请参考以下文章
使用 exists() 的 Cloud Firestore 规则是不是算作读取?
Firestore 安全规则 - 如何检查某个字段是不是被修改?
Firebase 存储规则在 Firestore 文档上查找数据? [复制]