是否存在一种内置方法来检查用户的存在,而不会将您的“用户”集合暴露给未经身份验证的用户? (只读访问仍将暴露整个用户集合。)下面是传统的解决方案:
usersRef.child('users').child(userId).once('value', function(snapshot) {
var exists = (snapshot.val() !== null);
});
我的用例是一个包含多个步骤的注册流程。我想在候选人到达最后一步之前检查用户的存在。
我对如何解决此问题的最初想法是创建一个Admin服务,该服务可以在限制单个用户的查询的同时返回结果(类似于内置登录逻辑如何限制多次无效重试)。
我知道从createUserWithEmailAndPassword
返回的“ 身份验证/已使用电子邮件”错误代码。但是,需要在提供密码之前进行检查。
在开始提供该服务之前,请确保它不存在;)
答案 0 :(得分:2)
要能够检查某个节点是否存在,您必须能够读取该节点。如果我们专门查看您的代码:
TailerListener listener = new ShowLinesListener();
File file = new File("C:/LogFiles/Radius-log");
System.out.println("inside main");
Tailer tailer = Tailer.create(file, listener);
Thread thread = new Thread(tailer);
thread.setDaemon(true); // optional
thread.start();
此代码要求用户具有对usersRef.child('users').child(userId).once('value', ...
的读取权限。它不要求他们有权访问所有/users/$userId
。
与创建顶级/users
节点相同,您可以在其中保留已使用的电子邮件。要检查特定的电子邮件是否已在使用中,用户所需的全部就是访问emails
的权限,而不必访问/emails/$email
。
所以:
/emails
关于这些规则的重要之处在于,任何试图从{
"rules": {
"users": {
"$uid": {
".read": "auth.uid !== null"
}
},
"emails": {
"$email": {
".read": "auth.uid !== null"
}
}
}
}
或/users
进行读取的人都会被拒绝,从而阻止他们访问所有用户或电子邮件的列表。但是给定一个单独的UID或电子邮件地址,他们可以检查是否已声明该身份。
请注意,完善自己的服务也可以。但是,如果基本用例是安全地检查是否已经声明了特定的UID /电子邮件,则可以只使用数据库。