gpt4 book ai didi

java - 将 IP 地址存储在 UserDetails 实例中

转载 作者:行者123 更新时间:2023-12-01 18:33:41 25 4
gpt4 key购买 nike

在我的 Web 应用程序中,我使用 Spring Security 和 UserDetailsS​​ervice 实现进行身份验证。

现在我需要获取当前 session 的客户端 IP 地址并将其存储在某处,并且我想将其存储在 UserDetails 实例中以便在需要时检索它。

实现这一目标的正确方法是什么? Spring MVC/Security 中是否有任何工具可以在服务层获取 IP 地址?

注意如果客户端未经过身份验证,我还需要知道 IP 地址(以记录访问尝试)

最佳答案

IP 地址已存在于 Authentication 中对象(不是UserDetails)。

您可以调用getDetails()Authentication 对象上以及在 Web 应用程序和正确配置的 Spring Security 环境中,这将为您提供 WebAuthenticationDetails 的实例。其中包含 ip 地址。您可以调用getRemoteAddress方法获取地址。 (参见javadoc)..

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
WebAuthenticationDetails details = (WebAuthenticationDetails) auth.getDetails();
String ipAddress = details.getRemoteAddress();

沿着这些思路,您可以将其放在实用方法或其他方法后面来获取 IP 地址。

显然您想要记录身份验证尝试,这可以通过实现 ApplicationListener 并让它监听 AbstractAuthenticationEvent 来轻松实现。 Spring Security 为每次身份验证尝试发出这些信息,并且还包含身份验证(包含 IP 地址)。

public class AuthenticationAttemptLoggerListener implements ApplicationListener<AbstractAuthenticationEvent> {

private final Logger logger = LoggerFactory.getLogger(AuthenticationAttemptLoggerListener.class);

public void onApplicationEvent(AbstractAuthenticationEvent event) {
Authentication auth = event.getAuthentication();
WebAuthenticationDetails details = (WebAuthenticationDetails) auth.getDetails();
String ipAddress = details.getRemoteAddress();

if (event instanceof AbstractAuthenticationFailureEvent) {
logger.warn("Unsuccesful authentication attemped from: {}", ipAddress);
} else {
logger.info("Succesful authentication attemped from: {}", ipAddress);
}
}
}

这样的东西应该捕获并记录所有内容。您可能想查看所有 available events .

关于java - 将 IP 地址存储在 UserDetails 实例中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22985204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com