0

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

  • 用户在 Chrome 上登录。
  • 打开 Firefox,尝试登录,然后无法登录,因为会话已在 Chrome 上处于活动状态

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

4

2 回答 2

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
    }
}
于 2013-01-14T17:47:34.757 回答
1

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

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

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

    您的 中将有一个新字段(例如sess_user_idfactories.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
    
  3. 您需要将方法sessionReadsessionWrite从您的自定义会话存储更新到:

    • 插入/更新新字段(user_id)
    • 检查 user_id 是否已经存在并且会话时间是否正常。如果不是,则抛出异常。您必须在用户登录时捕获此异常,以显示有关该问题的消息。
于 2013-01-15T10:08:50.313 回答