2012-12-28 67 views
1

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

这就是我的意思是:

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

这可能吗?

回答

1

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

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

+0

非常感谢,我想我会得到第二个选项,你觉得这个怎么样:。用LAST_LOGIN日期时间FOSUserBundle自动保存在数据库中的数据时。用户登录后,在会话中保存完整的日期时间(精确到秒),当发出任何请求时,检查两个地方(会话和用户表)中的信息是否一致,否则,说拜拜并销毁会话。是不是? – ElPiter

0

纠正我,如果我错了,但我认为终于没有办法做我试图从Chrome以来(我也认为FF)保存确切的cookie,并能够恢复会话滑动所有LoginHandler方法。

让我来解释一下自己。

对,我正要(实际上我一样)来实现你的答案和注释中描述的解决方案:

  1. 用户X进入该网站与使用Safari他的登录/密码(例如)
  2. 登录日期时间同时存储在数据库表User和会话
  3. 没有注销,同一用户X打开一个不同的浏览器(Chrome,例如)
  4. 新的登录日期时间在数据库中更新和在Firefox sess中离子
  5. 用户回来Safari浏览器,并试图刷新页面
  6. 他得到一个异常的日期时间不与存储在会话

好了一个一致...伟大的,到目前为止,因为它似乎解决了这个问题。

这里来了一个大问题:如herehere所述,Chrome没有正确删除会话cookie。因此,当用户没有注销并关闭浏览器时,只要他或她回到Chrome,会话就会自动恢复,而不通过登录处理程序,登录方法或任何其他方式。

这会导致“神奇”的datetime键不能同时保存在数据库和会话中,因此,将一根棍子放在只允许一次会话的地方,原来的计划是什么。

更多关于此问题的信息?

我想哭:(

+0

正如我所说的,你还应该实现你自己的[Voter](http://symfony.com/doc/current/cookbook/security/voters.html)来处理这些日期时间比较。失败(在你的例子中为5-6),注销用户(参见[“Symfony2:如何在控制器中手动注销用户?”](http ://stackoverflow.com/a/6474975/1337344))和'return VoterInterface :: ACCESS_DENIED;'。请参阅文档以获取有关安全性以及如何实现自定义选举器的更多信息。 – iamdto

+0

谢谢,我很了解它。但是,请从我开始的地方开始阅读“这里来了大事”。真的,我明白如何进行这种比较(即使没有Voter框架(尽管我会看看它)),但正如我所说的,问题是,我将永远无法拦截会话创建,因为它是没有确实创建,但只是恢复,并没有通过任何“LoginHandler”或登录方法或类似的东西。可能是我真的错过了一些东西,但我不明白。我会看看Voter,但根据你所说的,我认为它不会解决。 – ElPiter