【问题标题】:PHP Redis session handler multi userPHP Redis 会话处理程序多用户
【发布时间】:2015-08-20 07:24:29
【问题描述】:

假设我们有一个用户,他像往常一样登录并浏览该网站。然后我们可以说......这个用户的兄弟,他不想从不同的 ip 或不同的浏览器登录到同一个帐户。是否可以检查 redis 是否有当前活动会话并因此拒绝访问以防止同一用户多次登录?

【问题讨论】:

    标签: php session laravel redis


    【解决方案1】:

    首先,您的问题与phpnode.js 标签有什么关系?您尝试在哪个案例中实施您的案例?

    其次,无论环境如何,存储到 Redis 中的内容取决于您决定存储会话数据之外的内容。通常会话数据存储一个随机的sessionid 和一个与之关联的userid。不过,在某些情况下,您可以选择将会话关联到尚未经过身份验证的用户,从而存储没有任何用户关联的会话。

    防止来自不同 IP 的并发用户访问更多的是与身份验证机制有关,而不是会话逻辑。

    防止来自不同 IP 地址的并发登录的一种方法是保存活动用户的映射,例如 <userid, ip>。然后,在您检查凭据后,您还检查该映射以查看用户是否从不同的 IP 地址处于活动状态。在这种情况下,您可以拒绝身份验证。

    该解决方案还暗示了一些针对未安全注销的用户的清理机制,这与会话清理(time_to_live)非常相似。为了推进现有的实现,您可以在会话存储中添加一个 IP 地址字段以及身份验证时的用户 ID,使用与前面描述的身份验证相同的逻辑。会话现在看起来像<sessionid, userid, ip>。这只是一种搭载会话存储并利用其清理过程的方法。

    【讨论】:

    • 我很抱歉 node.js 标签,不知道为什么我添加它。因为这将在 PHP 中完成,所以我添加了这一点。而且我确实相信它与会话逻辑有关,因为我必须以一种有效的方式存储登录时的会话,以便检查当前是否有特定用户登录时的会话,如果有,我们不会让他登录,如果没有,我们继续。
    • 我不熟悉任何用于会话管理的 PHP 示例,但根据一般概念,您确实有一个尚未经过身份验证的用户(无法识别)的会话。将浏览器视为用户。如果您仅将会话与经过身份验证的用户相关联,则可以通过检查用户是否已注册会话来防止并发使用。如果您只想防止来自不同地址的并发使用,则需要在会话中添加一个 IP 字段。
    • 我明白了,但不是实际保存IP,为什么不通过cookie识别用户?因为如果他的ip改变了,他就完蛋了。而且我过去曾处理过 ip 限制,并且按照您的意愿实际工作是一件很痛苦的事情。我没有实际使用 ip,而是在想,如果你可以将他的 phpsession id 和 userid 保存在 redis 中,下次有人尝试使用他的凭据登录时,它会抛出错误,因为已经有一个具有相同 userid 的会话。
    • 您确实通过具有sessionid 值的cookie 来识别用户。我的回答集中在您想要限制对 1 个设备或 1 个位置的访问的天气上。例如:1 台设备: 用户拥有一台电脑和一部手机。他一次只能从 1 个登录。 1 个位置: 用户可以在家中通过计算机和手机登录,但如果他在家中登录,则无法在工作计算机上使用他的凭据。最终,这决定了您是否需要在 Redis 中的 [sessionid, userid] 之外添加一个 IP 字段。 继续...
    • 请记住,您只使用IP 来限制不同的位置,而不是任何会话逻辑。您仍然使用sid cookie 进行身份验证,只是您进行第二次检查以查看他是否从他已通过身份验证的同一来源(IP)请求。同样,我的答案取决于您要限制什么:设备或位置。
    猜你喜欢
    • 2018-08-11
    • 2020-08-13
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多