2014-09-05 4 views
1

Есть несколько похожих вопросов в Stack Overflow, но никто не дает мне понять, как справиться с моей проблемой.Сохранять идентификатор сеанса после входа в систему CakePHP

Я переношу свое приложение с CakePHP 1.3 на 2.x, и у меня есть проблема с тележкой. Мои пользователи могут добавлять товары в корзину, пока не регистрируются, и я объединять элементы своей корзины после входа в систему. В 1.3 это работает хорошо, потому что идентификатор сеанса не был изменен после входа в систему, но теперь эта функция нарушена, потому что идентификатор сеанса изменяется после входа пользователя в систему.

Есть ли способ оставить старый идентификатор сеанса после входа в систему или мне нужно что-то написать? Если да, то что может быть «лучшей практикой» здесь?

В настоящее время я сохранить в БД тележках для authentificated пользователей с их user_id и для анонимных пользователей с их session_id и после входа в систему, я просто найти телегу user_id и session_id, объединить элементы и чем удалить корзину с session_id, но теперь это невозможно сделать, потому что от session_id изменение.

+1

Вы можете просто сохранить информацию о загрузке для не прошедших проверку пользователей в сеансе, и вы не потеряете ее после входа в систему. – ADmad

+0

Спасибо, это было для меня неожиданностью. Я не проверял этот случай из-за изменения 'session_id', поэтому считаю, что данные сеанса также были потеряны. Но теперь я просто сохраняю анонимный 'session_id' в' Session' в AppController и каждый раз проверяю, был ли он установлен, и пользователь аутентифицирован. Я делаю элементы слияния корзины с этим 'session_id' вместо текущего. Хотя принятый ответ правильный, я не могу использовать этот подход, потому что в моем приложении более одного метода входа в систему. – Yaroslav

+0

Компонент Auth восстанавливает идентификатор сеанса после входа в систему из соображений безопасности. Данные сеанса сохраняются, когда PHP восстанавливает новый идентификатор сеанса. Единственная причина, по которой у вас возникают проблемы, заключается в использовании устаревшего идентификатора сеанса. Я не вижу большой пользы в сохранении корзины не прошедших проверку пользователей в базе данных. Держите его в сеансе, а затем сохраняйте db после входа в систему. – ADmad

ответ

0

Если вы посмотрите в источнике AuthComponent, вы можете увидеть, что это поведение по умолчанию в торте 2.x, чтобы предотвратить фиксацию сеанса. Я думаю, что самым простым решением было бы прочитать ваши данные сеанса до того, как вы вызовете действие входа и успеете записать или объединить данные обратно в новый сеанс. Если вам нужно сохранить старый идентификатор сеанса, добавьте его в сеанс после входа в систему.

if ($this->Session->check('Cart.session_id')) { 
    $sessionId = $this->Session->read('Cart.session_id'); 
} else { 
    $sessionId = session_id(); 
} 
$userId = $this->Session->read('Cart.user_id'); 
if ($this->Auth->login()) { 
    // on successful login find your customer in DB and merge the session data like you did 
    ... 
    // in the case you need to keep the session_id for reference... 
    $this->Session->write('Cart.session_id') = $sessionId; 
} 

Надеется, что это помогает ...

обновления - если вы не можете использовать его, как я показал, еще проще вариант для хранения session_id() внутри сессии, в то же самое время, когда вы вставляете или обновите данные заказа пользователя. Так что только этот фрагмент:

if (!$this->Session->check('Cart.session_id')) { 
    $this->Session->write('Cart.session_id', session_id()); 
} 

Эта информация будет жить до тех пор, пока сессия не будет снята.

+0

Это немного преувеличено. Я считаю, что можно оставить только '$ sessionId = session_id();' и после 'if ($ this-> Auth-> login()) использовать его вместо реального идентификатора сеанса для объединения элементов моей корзины.Поэтому использование 'Session' здесь бесполезно. Но я отвечу на ваш ответ, потому что это правильно, и я сделал что-то подобное. Благодарю. – Yaroslav

+0

Да, я не уверен во всем прецеденте, поэтому я добавил больше, чем нужно. Однако почему бы не сохранить session_id в сеансе, если он еще не установлен? Делая это, регенерация сеанса не является проблемой, вам не нужна дополнительная логика в AppController, и вы просто будете делать '$ this-> Session-> read ('your_session_id')' где вам это нужно ... – lp1051

-1

, когда журнал в годовом сопоставлении вам создать сессию, так что читать данные из сессии вы можете прочитать это следующим образом:

$this->Session->read('Auth.User.user_id); 

Пользователь название модели.

+0

Мне нужно, чтобы 'session_id' сессии был * до * входа пользователя. Или способ сохранить один и тот же 'session_id' после входа пользователя в систему. – Yaroslav

+0

Если мы подумаем об этом комментарии в случае сохранения данных сеанса после входа в систему, а 'session_id' будет изменен, чтобы ответ не был таким неправильным, как раньше. – Yaroslav

Смежные вопросы