0

编辑为了尝试简化这个问题......在一个非常基本的层面上,我相信这必须是会话系统的一个相当基本的需求......我们如何在不破坏 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  

编辑:反对票是怎么回事?=/

4

1 回答 1

1

我建议在调用 logout() 之前删除存在位。

如果您想跟踪已注销用户的“存在”,您可以将新的存在位设置为未经身份验证的用户,也可以匿名登录: https ://www.firebase.com/docs/security /simple-login-anonymous.html

于 2014-06-18T03:51:30.497 回答