【发布时间】:2015-08-20 07:24:29
【问题描述】:
假设我们有一个用户,他像往常一样登录并浏览该网站。然后我们可以说......这个用户的兄弟,他不想从不同的 ip 或不同的浏览器登录到同一个帐户。是否可以检查 redis 是否有当前活动会话并因此拒绝访问以防止同一用户多次登录?
【问题讨论】:
假设我们有一个用户,他像往常一样登录并浏览该网站。然后我们可以说......这个用户的兄弟,他不想从不同的 ip 或不同的浏览器登录到同一个帐户。是否可以检查 redis 是否有当前活动会话并因此拒绝访问以防止同一用户多次登录?
【问题讨论】:
首先,您的问题与php 和node.js 标签有什么关系?您尝试在哪个案例中实施您的案例?
其次,无论环境如何,存储到 Redis 中的内容取决于您决定存储会话数据之外的内容。通常会话数据存储一个随机的sessionid 和一个与之关联的userid。不过,在某些情况下,您可以选择将会话关联到尚未经过身份验证的用户,从而存储没有任何用户关联的会话。
防止来自不同 IP 的并发用户访问更多的是与身份验证机制有关,而不是会话逻辑。
防止来自不同 IP 地址的并发登录的一种方法是保存活动用户的映射,例如 <userid, ip>。然后,在您检查凭据后,您还检查该映射以查看用户是否从不同的 IP 地址处于活动状态。在这种情况下,您可以拒绝身份验证。
该解决方案还暗示了一些针对未安全注销的用户的清理机制,这与会话清理(time_to_live)非常相似。为了推进现有的实现,您可以在会话存储中添加一个 IP 地址字段以及身份验证时的用户 ID,使用与前面描述的身份验证相同的逻辑。会话现在看起来像<sessionid, userid, ip>。这只是一种搭载会话存储并利用其清理过程的方法。
【讨论】:
sessionid 值的cookie 来识别用户。我的回答集中在您想要限制对 1 个设备或 1 个位置的访问的天气上。例如:1 台设备: 用户拥有一台电脑和一部手机。他一次只能从 1 个登录。 1 个位置: 用户可以在家中通过计算机和手机登录,但如果他在家中登录,则无法在工作计算机上使用他的凭据。最终,这决定了您是否需要在 Redis 中的 [sessionid, userid] 之外添加一个 IP 字段。 继续...
IP 来限制不同的位置,而不是任何会话逻辑。您仍然使用sid cookie 进行身份验证,只是您进行第二次检查以查看他是否从他已通过身份验证的同一来源(IP)请求。同样,我的答案取决于您要限制什么:设备或位置。