Sinatra / Warden / Ruby - 如何确保我的用户只能通过一次会话登录?

时间:2013-12-27 01:49:59

标签: ruby session sinatra unique warden

我正在构建的网站要求用户一次只能使用一个会话登录。如果用户在当前登录时尝试从其他浏览器或计算机登录该站点,则需要拒绝其登录尝试。

我已经考虑将数据库中的用户对象标记为已登录,但这对我来说似乎很脆弱,因为如果用户实际上没有正式注销,则该标志仍然存在,并且用户被不公平地拒绝。要管理这个,我必须定期运行某种清理任务,以确保重置这些标志,这可能会引入各种其他问题。

我使用Sinatra作为核心框架,Warden作为身份验证管理器。对于这种要求,是否存在“最佳实践”策略?

2 个答案:

答案 0 :(得分:0)

这确实不是身份验证问题,而是“我如何处理经过身份验证的用户在登录时尝试登录时会发生什么情况” - 因此您需要先回答该问题。当某人已经登录时你想做什么?给出最新的会话优先级?也就是说,让同一个用户关闭旧会话?

答案 1 :(得分:0)

  

如果用户在当前登录时尝试从其他浏览器或计算机登录该站点,则需要拒绝其登录尝试。

  

如果用户实际上没有正式注销,那么该标志仍然存在并且用户被不公平地拒绝

彼此直接冲突。你必须选择哪些胜利,无论是旧的还是新的,你选择了旧的...所以那里没有什么不公平的。

  • 如果你进行了清理,那么你的会话即将到期,所以你必须选择一个有效的时间。这是HTTP的永恒问题,因为它是无状态协议。
  • 你可以使用伪“忘记密码”功能,在那里他们可以收到一封发送给他们的电子邮件,以便他们启动当前用户。
  • 也许您可以使用websockets,这将允许您监视连接并在会话另一端死亡时终止会话。如果它仍然打开,你可以和以前一样选择。