Несколько одновременных сессий PHP на пользователя - PullRequest
14 голосов
/ 20 мая 2011

Я работаю над веб-приложением, использующим PHP на Apache. Переменные $ _SESSION используются довольно редко для информации, которая должна сохраняться на страницах.

Нам нужно, чтобы каждый пользователь имел возможность открывать несколько одновременных сеансов в виде новых вкладок или новых окон в зависимости от выбора браузера. Прямо сейчас, когда пользователь открывает вкладку или окно добавления и заходит на сайт, существующий сеанс принимается. Как я могу предотвратить это, чтобы пользователь должен (или может) войти в систему и начать новый сеанс, не мешая ни одному из существующих сеансов, которые у него уже открыты?

Наш временный обходной путь - использовать несколько браузеров (IE и FF), но это явно не очень желательный способ работы.

Ответы [ 4 ]

8 голосов
/ 20 мая 2011

Описанное вами поведение противоречит концепции сеанса браузера. Зачем пользователю более одного сеанса? Это вопрос обеспечения контроля доступа пользователей? Если это так, назначьте пользователей логическим группам и предоставьте разрешения определенным группам. Нужно ли пользователям выполнять какие-либо действия от имени других пользователей? Если это так, разработайте веб-сайт на основе этой концепции, а не пытайтесь создать несколько сеансов для одного пользователя.

Если вам действительно нужно это сделать, вы можете сделать что-то ужасное, например, передать параметр запроса ( очень небезопасно! ) между страницами, чтобы действовать в качестве идентификатора сеанса, вообще обходя фактическую переменную $ _SESSION и управляя ваша собственная концепция сеанса. Опять же, это ненормально и в будущем приведет только к головным болям / проблемам безопасности.

2 голосов
/ 18 апреля 2012

Доступ к неатомарному параллельному управлению сеансом можно смоделировать с помощью следующей псевдокодированной логики:

function main(){
  $locker = new SessionLocking();
  /** read elements the $_SESSION "cached" copy. **/
  $var1 = $_SESSION['var1'];
  $var2 = $_SESSION['var2'];
  /** Pseudo Atomic Read **/
  $locker->lock(); //session is locked against concurrent access.
  $var3 = $_SESSION['var3'];
  $locker->unlock(); //session is committed to disk (or other) and can be accessed by another script.
  /** Psuedo Atomic Write **/
  $locker->lock(); //session is locked against concurrent access.
  $_SESSION['var4'] = "Some new value";
  $locker->unlock(); //session is committed to disk (or other) and can be accessed by another script
}

CLASS SessionLocking {

private static $lockCounter=0;
private static $isLoaded=false;

function __constructor(){
  if (!self::$isLoaded) load();
}

private function load(){
 $this->lock();
 $this->unlock();
}

private function lock(){
  if ($lockCounter<1) try {session_start();} Catch(){}
  $lockCounter++; 
}

private function unlock(){
  if ($lockCount<1) return;
  $lockCounter--;
  if ($lockCounter<1) try {session_write_close();} Catch(){}
}
}
1 голос
/ 20 мая 2011

Это было бы очень трудно сделать, если это вообще возможно.

Сессиям не нужно беспокоиться о том, на какой вкладке они находятся.

Кроме того, что произойдет, если сеанс 1 на вкладке 1 откроет новое окно? Это новый сеанс?

0 голосов
/ 12 марта 2016

Вот способ сделать это:

-Первое отключение сеансовых файлов cookie в php.ini с помощью:

session.use_cookies = 0

Это гарантирует, что файлы cookie не используются для передачи идентификатора сеанса.

- затем убедитесь, что вы генерируете все свои URL с включенным идентификатором сеанса (вы получаете его через функцию session_id (), например ::

print "<a href= \"http://www.example.com/".session_id()."&showlist=1\">show list</a>";
...