0

在我的应用程序中,我需要在应用程序工作开始时执行某种“自动登录”逻辑。在这个“自动登录”功能中,我做了很多操作,其中之一 - 使用 CookieComponent 设置 cookie。

当我在控制器或组件中使用此自动登录时 - 一切都很好,但是当我从调度程序过滤器执行相同操作时未设置 cookie。

我深入研究了 CakePHP 代码,发现当我尝试从调度程序过滤器设置 cookie 时,$_cookies属性为CakeResponse空。所以看起来调度程序过滤器创建了自己的CakeResponse,并且稍后重置,所以没有设置 cookie。

我的过滤器如下所示:

class UserLoadFilter extends DispatcherFilter 
{
    public $priority = 8;    
    public function beforeDispatch($event) {
        App::uses('AuthComponent', 'Controller/Component');
        if (!AuthComponent::user()) {
            App::uses('CustomAuthComponent', 'Controller/Component');
            //$controller = new AppController($event->data['request'], $event->data['response']);
            $auth = new CustomAuthComponent(new ComponentCollection(), Configure::read('Auth'));
            $auth->autoLogin();
        }
    }
}

我也试过这样直接在 beforeDispatch 方法中设置 cookie:

App::uses('CookieComponent', 'Controller/Component');
$cookie = new CookieComponent(new ComponentCollection());
$cookie->write('test', 'TEST!', false, "1 day"); 

但这也没有任何意义。

我做错了什么?也许我只是没有看到一些简单的东西,但是我花了很多时间仍然无法解决这个问题。是否可以从这个地方设置cookie?

当然,我可以尝试只使用 setcookie,或者编写自己的 cookie 包装器,但我想使用 CakePHP 风格,使用 cookie 组件。

4

1 回答 1

1

这对我来说似乎是错误的。2.x 使用身份验证和授权对象,因此不需要 CustomAuthComponent(即组件部分)。相反,您创建定制的身份验证和授权对象

我看不出为什么必须在 beforeDispatcher() 中完成此操作。那么你的目标到底是什么?您要实施哪种身份验证?

根据您的评论进行编辑:

在您按照鲍里斯所说的那样识别用户并设置您的区域设置(如果您做得对的话)之后,只需重定向即可。因此,只需从 beforeFilter() 中的 cookie 中读取 uuid,基于此获取用户记录并使用用户记录进行“手动”登录,然后重定向。

你在 AuthComponent 中修改了什么?

于 2012-07-29T19:03:48.103 回答