7

我想在我的 Web 应用程序中记录每次登录。我能够访问发生的登录,UsernamePasswordAuthenticationFilter但我不知道如何记录使用记住我功能登录的用户。我尝试覆盖

createSuccessfulAuthentication(HttpServletRequest request, UserDetails user)

TokenBasedRememberMeServices,但随后也会记录注销,因为 remember-me 服务会重新验证用户身份。

4

3 回答 3

8

记录身份验证成功和失败的最佳方法是使用 Spring ApplicationListener

Spring Security 发布了各种事件来验证身份验证成功和失败,您可以收听这些事件。当拒绝访问资源时,也会发布事件。

你可以看LoggerListener一个例子。首先将其中之一添加到您的应用程序上下文中,它将自动在警告级别记录身份验证事件。

关于记住我的登录,如果您注销然后立即访问该站点,并使用记住我的 cookie 重新进行身份验证,那么从技术上讲,这与任何其他记住我的身份验证相同,因此您无能为力关于它。

但是,如果您的注销成功 URL 正在通过记住我过滤器,并且这就是创建新会话的方式(无需用户进行任何其他操作),那么只需从安全过滤器链中省略该页面即可。

于 2012-07-08T14:45:36.530 回答
6

对于记录每个成功的登录,我认为最好的方法是创建 LoginSucessHandler 并为正常登录指定 authentication-success-handler 以及记住我。我用下面的代码和配置完成了这个。

@Service
public class LoginSucessHandler extends
        SavedRequestAwareAuthenticationSuccessHandler {

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request,
            HttpServletResponse response, Authentication authentication)
            throws ServletException, IOException {
        User user = (User) authentication.getPrincipal();
            // record login success of user
        super.onAuthenticationSuccess(request, response, authentication);
    }

}

<http auto-config="true" use-expressions="true">
    <form-login login-page="/login"
        authentication-failure-url="/login.hst?error=true"
        **authentication-success-handler-ref="loginSucessHandler"** />
    <logout invalidate-session="true" logout-success-url="/home"
        logout-url="/logout" />
    <remember-me key="jbcp" **authentication-success-handler-ref="loginSucessHandler"**/>
    <session-management>
    <concurrency-control max-sessions="1" />
</session-management>
</http>
于 2012-07-09T05:15:19.953 回答
0

我认为在您的情况下,当您使用自定义过滤器时将有助于解决方案,它将拦截对您的应用程序的每个请求。在此过滤器中,您可以记录每个请求的用户名。

在这里,我描述了如何添加您的自定义过滤器。您只需要将功能更改为您想要的。并且不要将您的过滤器放在 web.xml 中的安全过滤器链之后。

于 2012-07-06T06:32:30.930 回答