使用Spring Security记录登录

时间:2012-07-05 14:11:23

标签: spring-security

我想在我的网络应用程序中记录每次登录。我能够通过UsernamePasswordAuthenticationFilter访问登录,但我不知道如何记录使用remember-me功能登录的用户。我试过重写

createSuccessfulAuthentication(HttpServletRequest request, UserDetails user)
TokenBasedRememberMeServices

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

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:5)

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

Spring Security会发布各种可以监听的身份验证成功和失败事件。当资源被拒绝访问时,也会发布事件。

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

关于记住我的登录,如果您注销然后立即访问该站点,并使用记忆我的cookie重新进行身份验证,那么技术上与任何其他记住我的身份验证相同,所以没有太多你可以做到这一点。

但是,如果您的注销成功URL正在通过remember-me过滤器,那就是新会话的创建方式(没有来自用户的任何其他操作),那么只需从安全过滤器链中省略该页面即可

答案 2 :(得分:0)

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

Here I described how to add your custom filter。您只需要将功能更改为您想要的功能。并且不要在web.xml中将安全过滤器链后的过滤器放入。