首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony - Setting Cookie onKernelRequest

Symfony - Setting Cookie onKernelRequest
EN

Stack Overflow用户
提问于 2016-03-14 18:12:13
回答 1查看 4.1K关注 0票数 1

我希望能够设置Cookie onKernelRequest方法,但是cookie没有被设置,其他一切都运行正常,这里缺少什么?我想要实现的是,如果用户没有登录并且没有cookie,他应该看到http basic auth头文件。如果用户已登录或确实拥有cookie,则他可以访问预览域,而不必在http basic auth中输入他们的用户凭证。

代码语言:javascript
复制
const AUTH_USER = 'myuser';
const AUTH_PW = 'mypass';

public function sendAuthorizationHeader()
{
    header('WWW-Authenticate: Basic realm="Preview Domain"');
    header('HTTP/1.0 401 Unauthorized');
    die();
}

public function onKernelRequest(GetResponseEvent $event)
{
    if (!$event->isMasterRequest()) {
        return;
    }

    $request = $event->getRequest();
    $host = $request->getHost();
    $loginSuccessful = false;

    // check if we are on a preview domain
    if (preg_match('/^preview-\d+/', $host)) {
        $user = $request->getUser();
        $cookie = $request->cookies->get('preview_user');
        $phpAuthUser = $request->server->get('PHP_AUTH_USER');
        $phpAuthPw = $request->server->get('PHP_AUTH_PW');

        if (isset($phpAuthUser) && isset($phpAuthPw)) {
            if ($phpAuthUser == self::AUTH_USER && $phpAuthPw == self::AUTH_PW) {
                $loginSuccessful = true;
            }
        } else if ($user === null && $cookie === null) {
            $this->sendAuthorizationHeader();
        }

        if (!$loginSuccessful) {
            $this->sendAuthorizationHeader();
        } else {
            $cookie = new Cookie('preview_user', true, 86400, '/', null, false, false);

            $response = new Response();
            $response->headers->setCookie($cookie);
            $response->sendHeaders();
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2016-03-14 18:40:58

在响应对象上设置cookie除了向该请求添加cookie之外,不会做任何事情。您需要返回相同的响应对象,因此Symfony将其呈现回客户端。自己渲染它不是一个好主意,因为可能会有稍后发送的内容,而且它不是真正可测试的。

kernel.response事件侦听器中更容易做到这一点,因为您已经有了一个响应。请记住使用应用程序创建的响应。不要自己创建它。

如果基于在请求期间也应该可用的逻辑设置cookie,则可以将其拆分为两个事件侦听器方法。一个将在kernel.request上设置请求属性,另一个将在kernel.response上设置响应的cookie

代码语言:javascript
复制
public function onKernelRequest(GetResponseEvent $event)
{
    // your logic goes here. calculate the $result
    // ...

    $event->getRequest()->attributes->set('my_result', $result);
}

public function onKernelResponse(FilterResponseEvent $event)
{
    $response = $event->getResponse();
    $request = $event->getRequest();

    $myResult = $request->attributes->get('my_result');
    $cookie = new Cookie(/* ... */);

    $response->headers->setCookie($cookie);
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35984666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档