2016-03-14 6 views
1

Я хочу, чтобы можно было установить Cookie onKernelRequest Method, но cookie не установлен, Все остальное работает нормально, что здесь отсутствует? Что я хочу достичь, так это то, что если пользователь не войдет в систему и не имеет cookie, он должен увидеть основные заголовки заголовков HTTP. Если пользователь вошел в систему или имеет файл cookie, он имеет доступ к доменам предварительного просмотра без необходимости вводить свои учетные данные пользователя в http basic auth.Symfony - Настройка Cookie onKernelRequest

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(); 
     } 
    } 
} 
+1

Отправка печенье должно пройти через объект ответа, а не запрос, я думаю, вы должны использовать другое событие такого как на KernelResponse, может быть? – Pierre

+0

Дело в том, что мне нужно это приложение, когда мы запрашиваем такие домены, как предварительный просмотр-1234. Работает ли это на KernelResponse? Пьер? – Sharpy35

+0

Я пробовал теперь с onKernelResponse, но cookie все еще не установлен :( – Sharpy35

ответ

3

Установка файла cookie на объект ответа не делает ничего, кроме добавления cookie к этому запросу. Вам нужно вернуть тот же объект ответа, поэтому Symfony возвращает его клиенту. Оказание этого - это не очень хорошая идея, так как позже может быть отправлено содержимое, и это не может быть проверено.

Это легче сделать в прослушивателе событий kernel.response, так как у вас уже есть ответ. Не забудьте использовать ответ, созданный вашим приложением. Не создавайте его самостоятельно.

Если вы установите cookie на основе логики, которая также должна быть доступна во время запроса, вы можете разбить ее на два метода прослушивания событий. Один будет установлен атрибут запроса на kernel.request, а другой будет устанавливать кук в ответ на kernel.response:

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); 
} 
+0

приветствует совет Jakub. Могу ли я добавить метод onKernelResponse так же, как он есть, или мне нужно его настроить в services.yml? – Sharpy35

+0

Вы, очевидно, вам нужно настроить прослушиватели событий как службы (пометить их). Вы можете добавить несколько тегов к одной службе, если хотите сохранить обоих слушателей в одном классе. –

+0

Jakub проверьте мой ответ ниже, пожалуйста :) – Sharpy35

Смежные вопросы