Как запретить пользователю регистрироваться только один раз за сеанс?

Я работаю над приложениями Symfony 1.4, и мне нужно, чтобы пользователь не мог войти в приложение более одного раза, я имею в виду, что если S / He уже зарегистрирован, он не сможет войти в систему, просто открыв новый браузер.

  • войдите в Chrome.
  • Откройте Firefox, попробуйте войти в систему, а затем не сможете войти, потому что сеанс уже активен в Chrome.

Я хочу избежать того же самого пользователя, который начинает другой сеанс с другого браузера на том же компьютере или в другом.

Единственное решение, о котором я думаю, это использовать сеанс в MySQL (или в вашей базе данных), а затем проверить, активен ли сеанс для данного пользователя, чтобы он мог войти в систему или нет.

Это будет непростая часть. Я сделал это один раз, но не могу найти исходный код. Поэтому я опишу, что вам нужно будет сделать.

  1. Вам нужно активировать sfPDOSessionStorage для хранения сеанса в db ( вы можете следить за этим blogpost )
  2. затем создайте пользовательское хранилище, которое расширяет sfPDOSessionStorage чтобы иметь возможность добавлять больше полей в таблицу сеансов.

    У вас будет новое поле (например, sess_user_id ) внутри ваших 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 } }