编辑:为了尝试简化这个问题......在一个非常基本的层面上,我相信这必须是会话系统的一个相当基本的需求......我们如何在不破坏 onDisconnect 功能的情况下拥有一个安全的会话跟踪器?如果您添加安全规则,onDisconnect 将不起作用,如果您不添加安全规则,任何人都可以通过写入未受保护的表或删除其他人的存在来“欺骗”登录会话。
我正在尝试解决未调用“onDisconnect”的问题,因为我的安全规则只允许登录用户在 /sessions/$userid/“true” 中写入他们的存在数据......只要 onDisconnect 工作用户已登录,但如果该用户在注销后关闭浏览器,或由于超时而注销,则 onDisconnect 将被安全规则阻止。
起初我想......“哦,我可以追溯到发生注销的地方,并在那里再次清理会话存在。” 但我是否认为通过更多我会意识到 auth = newFirebaseSimpleLogin 回调“else”块似乎是检测注销的唯一方法。最重要的是,在注销发生后返回回调,以便将我返回到我需要登录的地方,以便 onDisconnect 调用可以删除我的会话,但此时,我已经注销了。
我错过了什么吗?是否有我不知道的注销前呼叫?我可以在安全规则文件中做些什么特别的事情来允许 onDisconnect 删除注销后的会话吗?
这是我为有问题的“表”设置的安全规则块:
"sessions":{
"$user":{
".write": "$user == auth.uid"
}
},
在 JS 中它很简单:
var con = ref.sessions[user].push(true);
con.onDisconnect().remove();
正如预期的那样,由于我没有登录 onDisconnect 我得到:
FIREBASE WARNING: set at /sessions/simplelogin:16 failed: permission_denied
编辑:反对票是怎么回事?=/