76 votes

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'IP ? Ou un autre moyen d'obtenir l'IP ?

153voto

meze Points 8829

Vous pouvez obtenir l'IP du client en utilisant le service de requête :

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

0 votes

Merci pour cette réponse rapide. Puis-je savoir d'où vient $container ?

16 votes

J'ai réussi à le faire fonctionner de la manière suivante : $ip = $this->container->get('request')->getClientIp() ;

5 votes

Notez qu'il est préférable d'utiliser la méthode de l'injection. $request directement, et non pas l'extraire du conteneur, de sorte que la simple utilisation de la fonction $request->getClientIp() serait suffisant

53voto

checat Points 106

Dans Symfony avant 2.3 $this->container->get('request')->getClientIp() ne fonctionne que dans le contrôleur de demande principal. Dans le contrôleur de sous-demande, cela renvoie toujours 127.0.0.1 . Dans le cas où votre projet utilise des sous-requêtes avec Symfony 2.2, la solution infaillible est de créer kernel.request et y enregistrer l'IP de la requête maître.

Dans Symfony 2.3 ceci a été corrigé de sorte que pour les sous-requêtes internes, l'IP réelle est poussée vers la liste des proxies, voir https://github.com/symfony/symfony/commit/2f3b33a630727cbc9cf21262817240a72a8dae0c Vous devez donc ajouter 127.0.0.1 a trusted_proxies 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é.

Aussi, 127.0.0.1 a dû être ajouté à trusted_proxies explicitement si le cache HTTP intégré ( AppCache en web/app.php ) était utilisé avant Symfony 2.3.20. Ce cache essaie de ressembler à un vrai reverse-proxy et modifie certains en-têtes de la requête maître. Corrigé dans https://github.com/symfony/symfony/commit/902efb8a84e8f0acf6a63e09afa08e3dcdd80fb9

Depuis Symfony 2.4 et en 3.x la manière préférée d'accéder à la demande actuelle est soit en utilisant request_stack service

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

ou l'injection de la 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 de l'exclusion de 127.0.0.1 lorsqu'il est utilisé dans des sous-requêtes est toujours d'actualité, mais vous pouvez maintenant essayer de vous référer explicitement à la demande principale en utilisant

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

18voto

yvoyer Points 4028

Pour info, à partir de Symfony 2.0 Request::getClientIp le site $proxy paramètre es déprécié . Il sera supprimé dans Symfony 2.3.

Vous pouvez soit utiliser

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

ou comme le répond @meze

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

7voto

shacharsol Points 496

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

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

1voto

Volker Points 561

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()"

3 votes

C'est une mauvaise approche. Il vaut mieux injecter la pile de requêtes elle-même et récupérer l'IP dans le constructeur.

0 votes

@Sharpy35 il n'y a aucune raison d'éviter cette approche, je doute que l'IP du client change pendant la requête ?

0 votes

Je ne vois pas comment cette approche fonctionne. Les services sont construits (et mis en cache) avant qu'une demande n'arrive.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X