Symfony 3.4 RequestStack -> MasterRequest -> ClientIp - PullRequest
0 голосов
/ 19 мая 2018

Я полностью понимаю, что я тестирую его на своем локальном хосте, но мне интересно, должен ли он возвращать реальный IP-адрес моего ноутбука или, как на самом деле, петлю ' :: 1 ' в каждом из следующих случаев... Будет ли это работать по-другому в производстве или я пропущу точку?

От контроллера

 <?php

namespace SD\UserBundle\Controller;

use FOS\UserBundle\Controller\SecurityController as OriginalController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;

class SecurityController extends OriginalController
{
  public function loginAction(Request $request)
  {
    $clientIp = $this->get('request_stack')
       ->getMasterRequest()
       ->getClientIp()
    ;

    if($this->get('sd_user.ip_foresight')->isBlackListed($clientIp))
    {
      return new RedirectResponse(
        $this->generateUrl('sd_user_forbidden')
      );
    }

    return parent::loginAction($request);
  }

}

От слушателя

<?php

namespace SD\UserBundle\EventListener;

use Symfony\Component\HttpFoundation\RequestStack;

class IpListener implements EventSubscriberInterface
{
  protected $requestStack;

  public function __construct(RequestStack $requestStack)
  {
    $this->requestStack = $requestStack;
  }

  public function clientIp()
  {
    return $this->requestStack->getMasterRequest()->getClientIp();
  }

  // ...

1 Ответ

0 голосов
/ 19 мая 2018

Вы делаете это правильно.Давайте посмотрим, откуда исходит IP-адрес:

  1. Браузер клиента отправляет запрос на http://example.com.
  2. Веб-сервер перехватывает запрос и его информацию, такую ​​как IP-адрес, заголовки и т. Д.
  3. Веб-сервер пересылает этот запрос бэкэнду (symfony) и передает информацию запроса.
  4. Symfony начинает процесс выполнения с заполнения главного Request объекта информацией, предоставленной веб-сервером.

Таким образом, в итоге вы получаете real IP-адрес клиента, а не тот, который был переопределен каким-либо действием, называемым подзапросом.

Но есть одно исключение, когда вы используете балансировщик нагрузки, вв этом случае просто прочитайте официальную документацию:

Как настроить Symfony для работы за балансировщиком нагрузки или обратным прокси

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...