如何限制用户每次会话只记录一次?

时间:2013-01-14 17:39:33

标签: php login symfony-1.4

我正在使用Symfony 1.4应用程序,我需要阻止用户多次登录应用程序,我的意思是如果S / He已经登录,它应该无法登录打开一个新浏览器。

  • 用户登录Chrome。
  • 打开Firefox,尝试登录,然后无法登录,因为会话已在Chrome上启用

我想避免同一个用户在同一台​​计算机上或另一台计算机上使用不同的浏览器开始另一个会话。

2 个答案:

答案 0 :(得分:1)

您可以通过以下方式检查用户是否已登录:

sfContext::getInstance()->getUser()->isAuthenticated()

或内部行动:

$this->getUser()->isAuthenticated()

所以我想你想要有类似的东西:

public function executeLogin($request)
{
    if ($this->getUser()->isAuthenticated()) {
        // redirect or whatever
        // $this->redirect(...);
    } else {
        // login user properly
    }
}

答案 1 :(得分:1)

我想到的唯一解决方案是在MySQL(或您的数据库)中使用会话,然后检查某个用户的会话是否处于活动状态,以便它可以登录。

这不是一件容易的事。我做了一次,但找不到源代码..所以我将描述你将要做的事情。

  1. 您需要激活sfPDOSessionStorage以在db(you can follow this blogpost
  2. 中存储会话
  3. 然后创建一个扩展sfPDOSessionStorage的自定义存储,以便能够在会话表中添加更多字段。

    您的sess_user_id内会有一个新字段(例如factories.yml),如下所示:

    all:
      storage:
        class: myCustomPDOSessionStorage
        param:
          db_table:       session
          database:       propel
    
          db_id_col:      sess_id
          db_data_col:    sess_data
          db_time_col:    sess_time
          db_user_id_col: sess_user_id
    
  4. 您需要更新方法sessionRead&从您的自定义会话存储空间sessionWrite到:

    • 使用新字段(user_id)
    • 插入/更新
    • 检查user_id是否已存在且会话时间是否正常。如果没有,抛出异常。用户登录时必须捕获此异常,以显示有关问题的消息。