如何使用 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 地址的请求