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 ?
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 ?
J'ai réussi à le faire fonctionner de la manière suivante : $ip = $this->container->get('request')->getClientIp() ;
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();
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.
@Sharpy35 il n'y a aucune raison d'éviter cette approche, je doute que l'IP du client change pendant la requête ?
Je ne vois pas comment cette approche fonctionne. Les services sont construits (et mis en cache) avant qu'une demande n'arrive.
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.