Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can you get a user's IP in PlayFramework2 ?

For security reasons, sometimes it is needed to block users by IP. In my case, I would like to manage the IP blacklist in a (SQL) database. I guess I can handle the filter part based on Action Composition but for that I need the user's IP.

So, how can I get the user's IP?

PS : The application is running behind a nginx proxy.

like image 297
i.am.michiel Avatar asked Dec 04 '22 15:12

i.am.michiel


2 Answers

If your Play! app is behind nginx (or any other reverse proxy), request.remoteAddress() will only return the IP address of your nginx host. In order to retrieve the real IP of the client you should have the following in your proxy_pass configuration of nginx:

location / {
  proxy_pass        http://play-app:9000;
  proxy_set_header  X-Real-IP  $remote_addr;
}

This will add the client IP as parameter to the header

doc: Nginx

And then within your Play! app you would retrieve it like this:

request.headers.get("X-Real-IP") //In Java
request.headers.get("X-Real-IP") //In Scala

doc: Java, Scala

like image 118
forker Avatar answered Dec 11 '22 11:12

forker


It's now possible with Play 2.0.2+ : RequestHeader.remoteAddress()

Java :

String ip = request().remoteAddress();

Scala :

Action { request =>
    val ip = request.remoteAddress()
}
like image 43
YoT Avatar answered Dec 11 '22 09:12

YoT