Sinatra / Warden / Ruby - 如何确保我的用户只能使用单个会话登录?
Posted
技术标签:
【中文标题】Sinatra / Warden / Ruby - 如何确保我的用户只能使用单个会话登录?【英文标题】:Sinatra / Warden / Ruby - How do I ensure that my users can only log in with a single session? 【发布时间】:2014-01-14 15:06:58 【问题描述】:我正在构建的网站要求用户一次只能使用一个会话登录。如果用户在当前登录时尝试从不同的浏览器或机器登录网站,他们的登录尝试需要被拒绝。
我考虑过将数据库中的用户对象标记为已登录,但这对我来说似乎很脆弱,因为如果用户实际上没有正式注销,那么该标志仍然存在并且用户被不公平地拒绝。为了解决这个问题,我必须定期运行某种清理任务以确保这些标志被重置,这可能会引入各种其他问题。
我使用Sinatra
作为核心框架,使用Warden
作为身份验证管理器。是否有针对此类要求的“最佳实践”策略?
【问题讨论】:
我在这里写了一篇关于一种可能的技术的文章:coffeepowered.net/2013/09/26/rails-session-cookies - 您希望将其调整为单个值而不是值列表,但它会起作用,并且会使最后一次登录的唯一有效会话。 【参考方案1】:这确实不是身份验证问题,而是“当经过身份验证的用户在他们已经登录时尝试登录时,我该如何处理发生的事情”——所以你需要先回答这个问题。当有人已经登录时,你想做什么?优先考虑最新的会话?也就是说,关闭同一用户的旧会话?
【讨论】:
没有。正如问题所指出的,我希望退回第二次登录尝试。【参考方案2】:如果用户在当前登录时尝试从不同的浏览器或机器登录网站,他们的登录尝试需要被拒绝。
和
如果用户实际上并没有正式注销,那么标志会持续存在并且用户会被不公平地拒绝
彼此直接冲突。你必须选择哪个胜出,旧的还是新的,而且你选择了旧的……所以没有什么不公平的。
如果您运行清理,那么您的会话将到期,因此您必须选择一个有效的时间。这对于 HTTP 来说是一个永恒的问题,因为它是一个无状态协议。 您可以使用伪“忘记密码”功能,让他们收到一封发送给他们的电子邮件,允许他们启动当前用户。 也许您可以使用 websockets,这将允许您监视连接并在会话在另一端死亡时终止会话。如果它仍然打开,您可以选择和以前一样。【讨论】:
用户“实际上并没有正式注销”并不意味着用户没有注销,因为他们的会话无论如何都会在一段时间后过期,我认为这是“非正式”注销。跨度> @DaveSag 您可以为标志添加创建(和/或)到期时间(例如,我经常使用忘记密码验证链接来执行此操作)然后它应该 与会话同时过期(如果您设置为同一时间并实际检查它!:)以上是关于Sinatra / Warden / Ruby - 如何确保我的用户只能使用单个会话登录?的主要内容,如果未能解决你的问题,请参考以下文章