web-dev-qa-db-fra.com

Comment obtenir l'adresse IP de l'utilisateur dans le contrôleur Symfony2?

J'ai besoin de stocker l'adresse IP des utilisateurs qui commentent, dans la base de données après la soumission du formulaire.

Existe-t-il une fonction symfony2 pour obtenir l'adresse IP? Ou tout autre moyen d'obtenir l'IP?

67
VishwaKumar

Vous pouvez obtenir l'adresse IP du client à l'aide du service de demande:

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

Dans Symfony avant la version 2.3 $this->container->get('request')->getClientIp() ne fonctionne que dans le contrôleur de requête principal. Dans le contrôleur de sous-requête, cela retourne toujours 127.0.0.1. Si votre projet utilise des sous-requêtes avec Symfony 2.2, la solution à toute épreuve consiste à créer kernel.request écouteur et enregistrez l'IP de la requête principale.

Dans Symfony 2.3 , ceci a été corrigé. Ainsi, pour les sous-requêtes internes, l'adresse IP réelle est poussée dans la liste des serveurs proxy, voir https: // github.com/symfony/symfony/commit/2f3b33a630727cbc9cf21262817240a72a8dae0c Vous devez donc ajouter 127.0.0.1 à trusted_proxies paramètre de configuration pour obtenir l'ip du client à partir de la requête dans les sous-requêtes dans Symfony 2.3+, mais vous ne devriez pas le faire sur un hébergement partagé pour des raisons de sécurité.

Également, 127.0.0.1 devait être ajouté à trusted_proxies explicitement si cache HTTP intégré (AppCache dans web/app.php) a été utilisé avant Symfony 2.3.20. Ce cache tente de ressembler à un véritable proxy inverse et modifie certains en-têtes de la demande principale. Correction dans https://github.com/symfony/symfony/commit/902efb8a84e8f0acf6a63e09afa08e3dcdd80fb9

Depuis Symfony 2.4 et dans 3.x le moyen préféré d’accéder au courant demande est soit en utilisant request_stack un service

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

ou en injectant une demande dans le contrôleur, voir http://symfony.com/doc/current/book/controller.html#the-request-as-a-controller-argument

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

Mais le problème concernant l'exclusion de 127.0.0.1 lorsqu'il est utilisé dans des sous-requêtes reste valable, mais vous pouvez maintenant essayer de faire explicitement référence à la demande principale à l'aide de

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

Pour votre information, à partir de Symfony 2.0 Request::getClientIp le $proxyparamètre est obsolète . Il sera supprimé dans Symfony 2.3.

Vous pouvez soit utiliser

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

ou comme réponse @ meze

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

Pour Symfony 2.6+, utilisez le code suivant (dans votre contrôleur:

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

il existe également un autre moyen d'injecter l'IP du client actuel dans tout appel de service ou de méthode:

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