2012-07-05 184 views
5

我想记录我的Web应用程序中的每个登录信息。我能够访问通过UsernamePasswordAuthenticationFilter发生的登录,但我不知道如何登录使用记住我功能登录的用户。我试图重写使用Spring Security录制登录

createSuccessfulAuthentication(HttpServletRequest request, UserDetails user) 
TokenBasedRememberMeServices

,但随后注销记录太多,因为记得我服务的重新认证用户。

回答

5

为了记录每个成功的登录,我认为最好的方法是创建LoginSucessHandler并为正常登录指定身份验证成功处理程序以及记住我。我用下面的代码和配置完成了这个。

@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> 
0

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

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

4

记录认证成功和失败的最佳方式是使用Spring ApplicationListener

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

您可以查看LoggerListener为例。首先将其中的一个添加到应用程序上下文中,并自动将警报级别的认证事件记录下来。

关于记住我登录,如果您注销然后立即访问网站,并使用记忆我cookie进行重新身份验证,那么从技术上讲,它与任何其他记住我身份验证相同,所以没有你可以做很多事情。

但是,如果您的注销成功URL正在通过记事本过滤器,并且正在创建新会话(没有来自用户的任何其他操作),则只需从安全性过滤器中忽略该页面链。