有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用Spring security将经过身份验证的用户的ip地址保存到DB?

当用户登录我的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>

与bean一起:

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

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

我希望在应用程序中成功验证用户时,将ip地址、时间戳和用户id保存到数据库中(通过调用自定义服务中的方法,该方法调用DAO方法)

我不知道该怎么办:我应该实现一个自定义身份验证提供程序吗?验证提供者?还是AbstractUserDetailsAuthenticationProvider?还是别的什么

更一般的问题:

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

B.如何检索用户的ip地址?(知道tomcat在反向代理中落后于apache)

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


共 (1) 个答案

  1. # 1 楼答案

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

    只需执行以下操作,即可从任何地方获得认证后的IP:

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

    试试看。如果由于反向代理导致错误IP地址,则考虑添加客户端IP作为请求报头。