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


How to restrict user to be logged only one time per session?

我正在工作一个Symfony 1.4应用程序,我需要防止用户能够登录不止一次进入应用程序,我的意思是如果S/他已经登录,它不应该能够登录只是打开一个新的浏览器。

  • 用户登录Chrome浏览器
  • 打开Firefox,尝试登录,然后无法登录,因为一个会话已经在Chrome上激活

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

我想到的唯一解决方案是在MySQL(或您的数据库)中使用会话,然后,检查会话是否为给定用户激活,以便它可以登录或不。

这不是一个容易的部分。我做过一次,但找不到源代码。所以我将描述你必须做什么。

  1. 你需要激活sfPDOSessionStorage以在数据库中存储会话(你可以关注这个博客文章)
  2. 然后创建一个扩展sfPDOSessionStorage的自定义存储,以便能够在会话表中添加更多字段。

    您将在factories.yml中有一个新字段(例如sess_user_id),如下所示:

    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
    
  3. 您需要更新方法sessionRead &从您的自定义会话存储sessionWrite到:

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

可以通过调用

检查用户是否登录
sfContext::getInstance()->getUser()->isAuthenticated()

或内部操作:

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

所以我猜你想要这样的:

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