如何使用 Spring 安全性将 IP 地址从经过身份验证的用户保存到数据库?

Posted

技术标签:

【中文标题】如何使用 Spring 安全性将 IP 地址从经过身份验证的用户保存到数据库?【英文标题】:How to save ip address to a DB from authenticated user with Spring security? 【发布时间】:2013-02-16 06:44:09 【问题描述】:

当用户登录我的 Spring 应用程序时,我需要跟踪 IP 地址。

security.xml:

<authentication-manager alias="authenticationManager">
<authentication-provider user-service-ref="userService">
    <password-encoder ref="passwordEncoder">
        <salt-source user-property='username' />
    </password-encoder>
</authentication-provider>

用豆子:

<beans:bean id="passwordEncoder"
    class="org.springframework.security.authentication.encoding.ShaPasswordEncoder">
    <beans:constructor-arg value="512" />
</beans:bean>

我有一个自定义 userService,其方法 loadUserByUsername() 返回自定义 UserDetails。此方法通过 DAO 从数据库中获取 UserDetails。 UserDetails 包含与用户相关的内容,例如用户名、密码、权限、电子邮件地址,以及特定于应用程序的变量。我需要在我的 JSP 页面中访问这些变量。

当用户在我的应用程序中成功通过身份验证时,我想将 IP 地址、时间戳和用户 ID 保存到数据库中(通过调用自定义服务中的方法,该方法调用 DAO 方法)。

我不确定该怎么做:我应该实现自定义身份验证提供程序吗?扩展 DaoAuthenticationProvider?还是 AbstractUserDetailsAuthenticationProvider?还是别的什么?

更一般的问题:

A.一旦用户提供了正确的凭据,我可以在哪里添加要调用的方法?

B.如何检索用户的IP地址? (知道tomcat在反向代理中运行在apache后面)。

我试图查看相关的问题/答案,但这让我更加困惑。如果有人可以提供一个非常简单的分步实现,那就太棒了。谢谢!

【问题讨论】:

【参考方案1】:

您可以提供一个自定义身份验证成功处理程序,该处理程序将负责将当前用户的 IP 保存在数据库中。请参阅form-login 标签的 authentication-success-handler-ref 属性。扩展现有实现之一(例如 SavedRequestAwareAuthenticationSuccessHandler)并添加您的功能将是个好主意。

您可以通过以下方式从任何地方获得身份验证后的IP:

WebAuthenticationDetails details = (WebAuthenticationDetails)SecurityContextHolder.getContext().getAuthentication().getDetails();
String ip = details.getRemoteAddress();

试试看。如果由于反向代理而给您错误的 IP 地址,请考虑将客户端 IP 添加为请求标头。

【讨论】:

谢谢!这确实是我需要的。我扩展了 SavedRequestAwareAuthenticationSuccessHandler 并添加了我的代码以相应地保存 IP 地址。但是,我正在使用 apache 作为反向代理运行 tomcat。因此我只看到本地 IP 地址(127.0.0.1)。如何指定在 apache 中添加正确的 ip 地址作为请求标头?以及如何在 authenticationSuccessHandler 中获取该 IP 地址?谢谢! 试试String ip = request.getHeader("X-Forwarded-For")。如果 Apache 未发送客户端 IP,请查看 this 插件。

以上是关于如何使用 Spring 安全性将 IP 地址从经过身份验证的用户保存到数据库?的主要内容,如果未能解决你的问题,请参考以下文章

用ping命令获取IP地址如何分析从源地点到目标地点要经过多少个路由器

如何设置 spring-boot 以允许从外部 IP 地址访问网络服务器

Spring Boot 安全性允许来自给定 IP 地址的请求

如何批量绑定MAC与IP地址

无论如何,是不是可以使用 lambda 自动将新 IP 地址分配给入站规则中的安全组

Spring中如何获取request的方法汇总及其线程安全性分析