【问题标题】:FOSUserBundle - Unique session accessFOSUserBundle - 唯一的会话访问
【发布时间】:2012-12-28 11:41:43
【问题描述】:

使用 Symfony 2.0 和 FOSUserBundle,我需要知道如何限制访问以使其唯一。

这就是我的意思:

  1. 用户 X 通过登录名/密码访问我的系统并创建会话
  2. 由于该会话仍然有效(未关闭会话等),同一用户 X 尝试从不同的计算机或位置进行访问。
  3. 在这种情况下,我需要系统通过某种消息避免其第二次访问:“该用户具有来自另一台计算机的有效会话”。

这可能吗?

【问题讨论】:

    标签: php security symfony fosuserbundle


    【解决方案1】:

    只有当您能够找到一种安全的方式来了解用户会话何时被破坏或他已从另一台计算机上注销时,这才是可能的并且是值得信赖的。因为它可以在没有用户明确操作的情况下发生(即他关闭了浏览器并且会话超时),所以我不会依赖它。当然,您总是可以尝试找到一些解决方法(即谓词会话到期时间和跟踪用户注销),但它仍然不是 100% 安全的。考虑新的访问将被拒绝的情况,因为会话仍在另一个浏览器上打开而没有人在它前面。

    另一方面,您可以使用VotersAllow one session only at a time 中的一些提示以另一种方式(当新用户登录时,其他用户注销)。

    【讨论】:

    • 非常感谢。我想我会得到第二个选择。您对此有何看法:使用 last_login 日期时间。 FOSUserBundle 自动将该数据保存在数据库中。当用户登录时,将完整的日期时间(精确到秒)保存在会话中。发出任何请求时,请检查两个位置(会话和用户表)的信息是否一致。否则,说再见并销毁会话。好方法,不是吗?
    【解决方案2】:

    如果我错了,请纠正我,但我认为最终没有办法做我想做的事情,因为 Chrome(我也认为是 FF)保存了确切的 cookie 并且能够恢复会话,跳过所有 LoginHandler 方法。

    让我解释一下。

    是的,我打算(实际上我做到了)实施您的答案和 cmets 中描述的解决方案:

    1. 用户 X 使用 Safari 使用其登录名/密码进入网站(例如)
    2. 登录日期时间存储在数据库中的表User 和会话中
    3. 在不注销的情况下,同一个用户 X 会打开不同的浏览器(例如 Chrome)
    4. 新的登录日期时间在数据库和 Firefox 会话中更新
    5. 用户返回 Safari 并尝试刷新页面
    6. 由于日期时间与会话中存储的日期时间不一致,他收到了异常

    嗯...到目前为止很好,因为它似乎解决了问题。

    重要的是:正如herehere 所述,Chrome 没有正确删除会话cookie。因此,当用户没有注销而只是关闭浏览器时,只要他或她返回 Chrome,会话就会自动恢复,而无需通过登录处理程序、登录方法或其他任何东西。

    这会导致“神奇的”日期时间键不能同时保存在数据库和会话中,因此,在一次只允许一个会话作为时间的情况下,原来的计划是什么。

    对这个问题还有更多的了解吗??

    我想哭:(

    【讨论】:

    • 正如我所说,您还应该实现自己的 Voter 来处理这些日期时间比较。每当比较失败时(在您的示例中为 5-6),您将注销用户(请参阅"Symfony2: how to log user out manually in controller?")和return VoterInterface::ACCESS_DENIED;。有关安全性以及如何实现自定义投票器的更多信息,请参阅文档。
    • 谢谢,我明白了。但是,请从我开始的地方开始阅读“重要的事情来了”。真的,我知道如何进行比较(即使没有 Voter 框架(尽管我会看看它)),但问题是,正如我所说,我永远无法拦截会话创建。确实没有创建,但刚刚恢复并且没有通过任何“LoginHandler”或登录方法或类似的东西。可能是我真的错过了一些东西,但我不明白。我去看看Voter,不过按照你说的,我觉得解决不了。
    猜你喜欢
    • 1970-01-01
    • 2016-02-12
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2010-09-13
    • 2019-02-15
    相关资源
    最近更新 更多