Symfony 3.4 RequestStack - > MasterRequest - > ClientIp

时间:2018-05-18 21:36:09

标签: symfony localhost ip-address symfony-3.4

我完全理解我在本地主机上测试它,但我想知道它是否应该返回我的笔记本电脑的真实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 :(得分:2)

你正在以正确的方式做到这一点。让我们看看IP地址的来源:

  1. 客户端的浏览器向http://example.com发出请求。
  2. Web服务器捕获请求及其信息,如IP地址,标题等。
  3. Web服务器将此请求转发给后端(symfony)并传递请求信息。
  4. Symfony通过填写Web服务器提供的信息来填写主Request对象的执行过程。
  5. 所以最后你获得了real个客户端IP地址,而不是被一些调用子请求的动作覆盖的地址。

    但是在使用负载均衡器时有一个例外,在这种情况下只需阅读官方文档:

    How to Configure Symfony to Work behind a Load Balancer or a Reverse Proxy