FOSUserBundle - 唯一的会话访问

时间:2012-12-28 11:41:43

标签: php security symfony fosuserbundle

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

这就是我的意思:

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

让我解释一下自己。

是的,我是(实际上我做的)实施你的答案和评论中描述的解决方案:

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

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

    最重要的是:如herehere所述,Chrome未正确删除会话Cookie。因此,当用户没有注销并且只是关闭浏览器时,无论何时他或她回到Chrome,会话都会自动恢复,而无需通过登录处理程序,登录方法或其他任何方式。

    这导致“魔法”日期时间键不能保存在数据库和会话中,因此,只需将一个会话作为时间放在一个方向盘中,原始计划是什么。

    关于这个问题还有什么亮点?

    我想哭:(