cakephp 2.x / uploadify:更改会话ID强制注销

时间:2011-12-25 05:23:50

标签: session cakephp login authentication

我正在搞乱uploadify和cakephp(2.x)atm,但我无法让它工作。它工作一小时前,现在它被神奇地摧毁了。

我的cakephp应用程序具有后端和简单的身份验证。用户可以使用uploadify上传图像,当uploadify将图像发送到我的控制器时,我只需将sessionid作为参数附加。

不幸的是我收到了HTTP-ERROR(HTTP / 1.1 304 Not Modified)。从验证中排除控制器的方法($ this-> allow(...))确实有帮助。因此,我假设有关身份验证/会话的事情失败。

我采取的下一步是检查SID是否已传输,并且确实已经传输了。

这就是为什么我认为我将问题缩小到会话ID设置的程度。这种情况发生在控制器的beforeFilter中,其方式如下:

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

当我添加那段代码时,我无法解释/理解:

我尝试通过backify中的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参数的会话ID提交给uploadify js脚本时,也会发生这种情况。

当我在控制器的方法中使用那行代码时:

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

方法echos 1234但是在我的后端的页面视图中它仍然表示原始会话值。到底是怎么回事?

是否有人可能知道发生了什么事,或者至少谁知道为什么Session / Auth会像它那样行事?

提前感谢您的帮助!

祝你好运


修复它。

我的控制器的beforeFilter()函数看起来像这样:

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

但是必须在调用parent :: beforeFilter()函数之前设置会话ID。

if ( isset($this->params['session_id']) ) { $this->Session->id($this->params['session_id']); }
parent::beforeFilter();
该死的浪费了很多时间..

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,我解决它的方法是创建一个组件: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();

这基本上会在应用程序完成任务之前调用,并且应该在任何可能丢失之前设置会话ID。

祝你好运!