Cakephp Session在Flash播放器中丢失了

时间:2009-11-20 10:06:24

标签: php flash actionscript-3 cakephp

只想知道是否有人遇到同样的问题。

网站需要登录才能执行某项任务。我们使用股票Auth组件来完成这项工作。

一切都很好,直到遇到构建在Flash中的界面。与Amf交谈似乎很好。但是当Flash播放器尝试与其他控制器通信时 - 由于会话没有呈现而得到重定向。

所以基本上当用户登录时 - 我需要以某种方式找到一种方法来登录Flash播放器。


此外: 这只能解决问题的一半。

稍微退一步。 Auth组件如何评估请求者?

如果Session.checkAgent为true。他们检查它是否是最后一个。因此Flash没有机会拥有不同的代理字符串。

现在好了 - 验证一下 - 什么?他们之前存储的会话cookie ...所以再次失败。

更新

感谢所有答案。

我尝试了建议的解决方案。只有一个问题。

当我尝试测试$ this-> params ['actions']是否以amf开头时,我正在使用Amf(作为Cakephp插件) - 它有时会工作无效。看着“查尔斯”我可以看到他们都打电话给amf控制器。非常令人费解....

5 个答案:

答案 0 :(得分:2)

在config / core.php中 尝试

Configure::write('Session.checkAgent', false);

答案 1 :(得分:1)

看来如果您在调用Session-> read(),Session-> check()或Session-> write()之前设法调用Session-> id($ sessionId),那么不需要打扰所有破坏旧会话,更新userAgent并删除co​​okie东西。

答案 2 :(得分:0)

在你的控制器的beforeFilter动作中使用它,由flash调用:

if ($this->action == 'flashCalledAction') {
    Configure::write('Security.level', 'medium');
    //Using instead the session specified
$this->Session->destroy();
$this->Session->id($_REQUEST['sessionId']);
$this->Session->start();

// We revert to the original userAgent because starting a new session modified it
$this->Session->write('Config.userAgent', $_REQUEST['userAgent']);
// We delete the flash cookie, forcing it to restart this whole process on each request
setcookie(Configure::read('Session.cookie'), '', time() - 42000, $this->Session->path);         
    }

然后你必须在每个flash调用中将这2个参数传递给这个控制器:

param: 'userAgent' -> value: '$this->Session->read('Config.userAgent')' 
param: 'sessionId' -> value: $this->Session->id()   

答案 3 :(得分:0)

http://blogs.bigfish.tv/adam/2008/04/01/cakephp-12-sessions-and-swfupload/

这是专门针对swfUpload的,但是会将session_id附加到网址以及checkAgent和会话安全设置的过程被覆盖,并且应该有助于指出正确的方向。

答案 4 :(得分:0)

Flash不会发送cookie及其请求,这就是Cake不会将其登录的原因。我这样做的方式是:您需要以某种方式将$this->Session->id()与您的Flash请求一起传递。这可能是最困难的部分,因为某些Flash应用程序不允许您在请求中标记某些信息。然后编写一个组件(FlashComponent,或任何你想要调用的组件)来检查它是否是一个flash请求,然后在其请求中查找会话ID并设置会话ID。您需要在'Auth'之前包含此组件:所以var $components = array('Flash','Auth',...)在Auth之前拦截请求。

或者您可以设置Auth->允许列表,但之后您会将这些操作暴露给非授权,并且操作将不知道当前登录用户是谁(除非您可以在Flash请求中传递某些内容) ,在这种情况下,使用我的第一个解决方案)。