7

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

安全.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后面)。

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

4

1 回答 1

9

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

只需执行以下操作,您就可以在任何地方进行身份验证后获取 IP:

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

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

于 2013-03-01T17:35:56.580 回答