【发布时间】:2017-10-04 06:07:09
【问题描述】:
如果用户的 IP 地址发生更改,我会尝试使用户会话无效(我想强制用户在整个会话期间保持相同的 IP 地址,或者他们需要重新进行身份验证)。我会假设 Spring Security 内置了一个功能来实现这一点,但我似乎找不到它。
实现这个要求的最优雅的方式是什么(最好通过 Spring Security 的配置)?
【问题讨论】:
标签: java spring-mvc session spring-security
如果用户的 IP 地址发生更改,我会尝试使用户会话无效(我想强制用户在整个会话期间保持相同的 IP 地址,或者他们需要重新进行身份验证)。我会假设 Spring Security 内置了一个功能来实现这一点,但我似乎找不到它。
实现这个要求的最优雅的方式是什么(最好通过 Spring Security 的配置)?
【问题讨论】:
标签: java spring-mvc session spring-security
我在 Spring Security 中找不到任何将会话绑定到 IP 的内置功能,但使用自定义过滤器很容易实现:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
boolean chainCompleted = implementEnforcement(request, response);
if (!chainCompleted) {
filterChain.doFilter(request, response);
}
}
private boolean implementEnforcement(HttpServletRequest request, HttpServletResponse response) throws IOException {
final String key = "enforcement.ip";
HttpSession session = request.getSession(false);
if (session != null) {
// we have a session
String ip = request.getRemoteAddr();
String ipInSession = session.getAttribute(key);
if (ipInSession == null) {
session.setAttribute(key, ip);
} else {
if (!ipInSession.equals(ip)) {
// JSESSIONID is the same, but IP has changed
// invalidate the session because there is a probability that it is
// a session hijack
session.invalidate();
// a redirection to some page (probably to context root) may be added here
return true;
}
}
}
return false;
}
它会记住用户的 IP 地址,然后将当前 IP 与记住的 IP 进行比较:如果不同,则销毁会话。
【讨论】:
X-Forwarded-For 标头,最好从标头中获取客户端IP 而不是request.getRemoteAddr()。请参阅此问题以了解这两者之间的区别 - stackoverflow.com/questions/63617756/…
RemoteIpValve ( tomcat.apache.org/tomcat-8.5-doc/api/org/apache/catalina/valves/… ) 这样的东西(即它从 request.getRemoteAddr() 返回 X-Forwarded-For 标头值