项目中要为SpringSecurity添加IP限制功能,一开始的做法是继承DaoAuthenticationProvider,在additionalAuthenticationChecks方法中使用WebAuthenticationDetails的getRemoteAddress获取客户端IP,然后判断是否需要限制登录。
在tomcat上单独部署时,这样做一切正常,当使用apache作为前端代理时,发现总是提示IP错误,从日志中发现,getRemoteAddress方法总是返回apache的IP。查看WebAuthenticationDetails的源码发现:
this.remoteAddress = request.getRemoteAddr();
当有代理存在时,request.getRemoteAddr()是不能正确获取客户端IP的(http://mrlee23.javaeye.com/blog/510747),
需要使用http header中的x-forwarded-for获取IP,方法如下: