cakephp 2.x / uploadify: изменение идентификатора сессии приводит к выходу из системы - PullRequest
2 голосов
/ 25 декабря 2011

Я возлюсь с uploadify и cakephp (2.x) atm, но не могу заставить его работать.Он работал час назад и теперь волшебным образом разрушен.

В моем приложении cakephp есть бэкэнд с простой аутентификацией.Пользователи могут загружать изображения с помощью uploadify, и когда uploadify отправляет изображение на мой контроллер, я просто присоединяю sessionid в качестве параметра.

К сожалению, я получаю HTTP-ERROR (HTTP / 1.1 304 Not Modified).Исключение метода контроллера из аутентификации ($ this-> allow (...)) действительно помогает.Поэтому я предполагаю, что что-то не так в отношении аутентификации / сеанса.

Следующий шаг, который я предпринял, состоял в том, что я проверил, был ли передан SID, и он это сделал.проблема в точке, где идентификатор сессии становится установленным.Это происходит в beforeFilter контроллера следующим образом:

if (isset ($ this-> params ['session_id'])) {$ this-> Session-> id ($ this-> params ['идентификатор сессии']);}

Когда я добавляю этот фрагмент кода, происходит что-то, что я не могу объяснить / понять:

Я пытаюсь загрузить изображение с помощью uploadify в резервное копирование, и оно возвращается с ошибкой HTTP.Нажатие F5 / Refresh вызывает перенаправление в форму входа, хотя я на самом деле вошел в систему!Я также получаю новый SID.

И я на 99% уверен, что параметр session_id передается в контроллер и что $ this-> Session-> id () должен установить правильный SID.

Так почему я выхожу из системы?

Я НЕ выхожу из системы, когда вручную вызываю URL для моего контроллера (http://localhost/myapp/backend/upload/12345 * 12345 - SID!).Только если uploadify делает это.

Я также попытался установить низкий уровень Cake Security Level, но это не поможет.Это также происходит, когда я фиксирую идентификатор сеанса с параметром scriptData в сценарии uploadify js.

Когда я использую эту строку кода в методе моего контроллера:

$this->Session->id(1234);
echo $this->Session->id();

метод echos 1234но на странице просмотра моего бэкэнда все еще указывается исходное значение сеанса.Что, черт возьми, происходит?

Есть ли кто-нибудь, кто может иметь представление о том, что происходит, или, по крайней мере, кто знает, почему Session / Auth ведет себя так, как он?

Заранее спасибо залюбая помощь!

С наилучшими пожеланиями


i исправлено it.

Функция beforeFilter () моего контроллера выглядела так:

parent::beforeFilter();
if ( isset($this->params['session_id']) ) { $this->Session->id($this->params['session_id']); }

но идентификатор сеанса должен быть установлен ДО вызова функции parent :: beforeFilter ().

if ( isset($this->params['session_id']) ) { $this->Session->id($this->params['session_id']); }
parent::beforeFilter();

черт -.- потратил впустую столько времени на это ..

1 Ответ

0 голосов
/ 07 января 2013

У меня была такая же проблема, я решил ее путем создания компонента: SessionRescueComponent и объявил это в вашем AppController FIRST:

public $components = array( 'SessionRescue', 'Auth', 'Security' ... );

В вашем новом компоненте:

class SessionRescueComponent extends Component {

  /**
     * Restore session from POST fields if possible.
     *
     * This is required because flash plugin uses a different
     * session (id and user agent) from the application one.
     *
     * @param Object &$controller pointer to calling controller
  */

       public function initialize( & $controller ) {

            if ( ( isset($_SERVER['HTTP_USER_AGENT'] ) and ( ( strtolower( $_SERVER['HTTP_USER_AGENT'] ) == 'shockwave flash' ) or ( strpos( strtolower( $_SERVER['HTTP_USER_AGENT'] ) , 'adobe flash player') !== false))) and 
                isset($controller->data['Model']['session_id']) and ( $controller->action == 'imageupload' || $controller->action == 'upload' || $controller->action == 'flashupload' ) ) {

                session_id( $controller->data['Model']['session_id'] );
                session_start();

            }
       }
}

Если вы хотите установить свою сессию в виде торта

внутри вашего класса:

public $components = array( 'Session' );

Тогда внутри вашего блока IF:

$this->Session->id( $controller->data['Model']['session_id'] );
$this->Session->start();

По сути, это будет вызвано до того, как что-либо будет сделано с приложением, и должно установить идентификатор сеанса, прежде чем что-либо может потеряться.

Удачи!

...