【问题标题】:How to set cookie in a CakePHP dispatcher filter?如何在 CakePHP 调度程序过滤器中设置 cookie?
【发布时间】:2012-07-30 18:03:53
【问题描述】:

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

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

我深入研究了 CakePHP 代码,发现当我尝试从调度程序过滤器设置 cookie 时,CakeResponse$_cookies 属性为空。所以看起来调度程序过滤器创建了自己的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 组件。

【问题讨论】:

    标签: cakephp cookies dispatcher cakephp-2.2


    【解决方案1】:

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

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

    根据您的评论进行编辑:

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

    你在 AuthComponent 中修改了什么?

    【讨论】:

    • 我尝试恢复用户数据并自动登录他,使用来自他的 cookie 的用户 UUID 的值(但如果用户没有具有 UUID 值的 cookie,我创建新的用户实体,并将用户 UUID 设置为此用户的 cookie)。所以,假设,如果用户将在几个月后返回网站,他将登录并重定向到他的语言环境。我想在 beforeDispatcher() 中执行此操作,因为我想在路由开始之前了解用户区域设置。关于自定义身份验证对象 - 我使用它,但我也需要在 Auth 组件中进行一些更改,所以我在我的 CustomAuthComponent 中扩展它。
    • @Vovkin 您可以在用户被识别并登录后重定向到正确的语言环境。这将消除在beforeDispatch() 中执行此操作的需要。
    猜你喜欢
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    相关资源
    最近更新 更多