wake-up-neo.com

Wie erhalte ich die Benutzer-IP-Adresse in Symfony2-Controller?

Ich muss die IP-Adresse der Benutzer, die Kommentare abgeben, nach dem Absenden des Formulars in der Datenbank speichern.

Gibt es eine symfony2-Funktion, um die IP zu erhalten? Oder einen anderen Weg, um die IP zu bekommen?

67
VishwaKumar

Sie können die Client-IP über den Anforderungsdienst abrufen:

$this->container->get('request')->getClientIp();
143
meze

In Symfony vor 2.3 funktioniert $this->container->get('request')->getClientIp() nur innerhalb des Master Request Controllers. Im Sub-Request-Controller gibt dies immer 127.0.0.1 Zurück. Für den Fall, dass Ihr Projekt Unteranforderungen mit Symfony 2.2 verwendet, besteht die kugelsichere Lösung darin, einen Listener kernel.request Zu erstellen und die IP aus der Master-Anforderung darin zu speichern.

In Symfony 2.3 wurde dies behoben, sodass bei internen Unteranfragen die reale IP in die Liste der Proxys verschoben wird (siehe https: // github.com/symfony/symfony/commit/2f3b33a630727cbc9cf21262817240a72a8dae0c Sie müssen also den Konfigurationsparameter 127.0.0.1 zu trusted_proxies hinzufügen, um die Client-IP aus der Anforderung in Unteranforderungen in Symfony 2.3+ abzurufen. Dies sollte jedoch aus Sicherheitsgründen nicht für Shared Hosting durchgeführt werden.

Außerdem musste 127.0.0.1 Explizit zu trusted_proxies Hinzugefügt werden, wenn der integrierte HTTP-Cache (AppCache in web/app.php) Vor Symfony 2.3.20 verwendet wurde. Dieser Cache versucht, wie ein echter Reverse-Proxy auszusehen, und ändert einige Header der Master-Anfrage. Behoben in https://github.com/symfony/symfony/commit/902efb8a84e8f0acf6a63e09afa08e3dcdd80fb9

Seit Symfony 2.4 und in 3.x der bevorzugte Weg, um auf aktuelle zuzugreifen Die Anforderung erfolgt entweder über den Dienst request_stack

$this->container->get('request_stack')->getCurrentRequest()->getClientIp();

informationen zum Einfügen von Anforderungen in den Controller finden Sie unter http://symfony.com/doc/current/book/controller.html#the-request-as-a-controller-argument

public function indexAction(Request $request)
{
    $ip = $request->getClientIp();
}

Die Bedenken bezüglich des Ausschlusses von 127.0.0.1 bei der Verwendung in Unteranforderungen bestehen jedoch weiterhin, aber Sie können jetzt versuchen, mit explizit auf die Hauptanforderung zu verweisen

$this->container->get('request_stack')->getMasterRequest()->getClientIp();
46

Zu Ihrer Information: Ab Symfony 2.0 Request::getClientIp das $proxyParameter ist veraltet . Es wird in Symfony 2.3 entfernt .

Sie können entweder verwenden

$container->get('request')->server->get("REMOTE_ADDR");

oder als @meze antwort

$container->get('request')->getClientIp();
17
yvoyer

Verwenden Sie für Symfony 2.6+ den folgenden Code (in Ihrem Controller):

      $this->container->get('request_stack')->getCurrentRequest()->getClientIp();
7
shacharsol

es gibt auch eine andere Möglichkeit, die aktuelle Client-IP in einen Dienst- oder Methodenaufruf einzufügen:

acme.currentIP:
    class: some\service\className
    arguments:
        - "@=service('request_stack').getCurrentRequest().getClientIp()"
2
SkyDiablo