У меня есть экран входа в систему, который я заставляю быть ssl, так вот: https://www.foobar.com/login, после того как они вошли в систему, они перейдут на главную страницу: https://www.foobar.com/dashbaord
Тем не менее, я хочу переместить людей из SSL после входа в систему (чтобы сохранить CPU), поэтому сразу после проверки того, что они действительно вошли в систему на https://www.foobar.com/dashbaord, я перемещаю их по адресу http: // www.foobar.com/dashbaord
Ну, это всегда, кажется, уничтожает переменные сеанса, потому что, когда страница запускается снова, она подтверждает, что они вошли в систему (как и все страницы), а сеанс не существует, поэтому он перемещает их на экран входа.
Нечетности / выводы:
То, что я пробовал:
Поэтому я чувствую, что это связано с созданием файла cookie, но не с чтением.
Окружающая среда: 1. Debian 2. Apache 2 3. Mysql 4 4. PHP 5 5. CakePHP 6. Сессии сохраняются по умолчанию PHP, как файлы
Я понял это. Cake переключал значение session.cookie_secure ini на лету, в то время как под SSL-соединениями автоматически, поэтому созданный файл cookie был безопасным файлом cookie, который вторая страница не распознала.
Решение, закомментируйте /cake/lib/session.php line 420 ish:
ini_set ('session.cookie_secure', 1);
(Просто найдите это, чтобы найти его, так как я уверен, что строка # будет меняться по мере выпуска релизов.)
Хотя принятый ответ отвечает желанию OP «переводить людей из SSL после входа в систему» - это ужасно неуверенно в том, что он подвергает сеанс пользователя угону (см. Firesheep для легкого использования).
Лучший компромисс между поведением CakePHP по умолчанию (который требует, чтобы все страницы обслуживались SSL после аутентификации пользователя через SSL), и принятый ответ (который обслуживает все аутентифицированные страницы, незашифрованные и подверженные аутентифицированному файлу cookie) предназначен для обслуживания страниц, зашифрованных через SSL, если и только если они требуют аутентификации.
Легкий способ добиться этого – поддерживать два сеансовых куки – тот, который защищен и содержит информацию аутентификации, а другой – небезопасный. Простая реализация для поддержки такого подхода с двойной сессией будет использовать session_handler для переопределения имени session.name так:
if (env('HTTPS')) { ini_set('session.name', Configure::read('Session.cookie').'-SECURE'); }else{ ini_set('session.name', Configure::read('Session.cookie')); }
Один из пунктов, который следует учитывать при таком подходе, заключается в том, что для ссылки с не-SSL-страницы непосредственно на страницу, для которой требуется аутентификация, вам потребуется явно связать использование https – поскольку вам нужно будет отправить файл cookie сеанса, содержащий информацию об аутентификации и браузер будет делать это только в том случае, если ссылка зашифрована.
Прежде всего, правильно ли я понимаю, что второй логин использует тот же самый механизм, что и первый (через HTTPS)?
Создает ли первый случай на незащищенной странице новый сеанс, в дополнение к тому, который был создан во время входа?
Убедитесь, что при первом входе в систему cookie не установлен с флагом Secure
(это означает, что cookie следует отправлять только через защищенное (HTTPS) соединение).
Вы можете указать собственные настройки обработки сеанса в файле конфигурации (а не редактировать файл библиотеки CakePHP.) В файле конфигурации вы можете установить session.cookie_secure в 0, что будет иметь приоритет над настройкой в / cake / lib / session. PHP. Это позволит использовать cookie сеанса как для SSL, так и для соединений, отличных от SSL.
Вот запись в блоге по теме: http://bakery.cakephp.org/articles/view/how-to-bend-cakephp-s-session-handling-to-your-needs
и некоторые документы из Поваренной книги: http://book.cakephp.org/view/173/Sessions
Вы можете прочитать больше в документации CakePHP по адресу http://book.cakephp.org/2.0/en/development/sessions.html. По умолчанию CakePHP устанавливает значение session.cookie_secure в true, когда ваше приложение работает по протоколу SSL. Если ваше приложение работает как с протоколами SSL, так и с протоколом, отличным от SSL, у вас могут возникнуть проблемы с потерями сеансов. Если вам нужен доступ к сеансу как для SSL, так и для доменов, не относящихся к SSL, вы должны отключить это:
Вы открываете файл Config / core.php и добавляете его ниже
Configure::write('Session', array( 'defaults' => 'php', 'ini' => array( 'session.cookie_secure' => false ) ));
Теперь вы можете переключать http и https, которые не теряют сеанс 🙂
Ваша домашняя страница получила флеш-память, которая делает последующий запрос на ваш сервер? Или любая загрузка содержимого Ajax?
Вы проверяли, что заголовки отправляются с сервера? В IE вы можете использовать Fiddler или Firefox, используя аддон Live Headers. Проверьте, установлены ли какие-либо новые файлы cookie или cookie CAKEPHP, имеющие другое значение.
просто столкнулся с этой проблемой, я прокомментировал
ini_set ('session.name', Configure :: read ('Session.cookie'));
from session.php (/cake/lib/session.php, строка 480 ~), и он работал нормально.