我想在我的网络应用程序中记录每次登录。我能够通过UsernamePasswordAuthenticationFilter
访问登录,但我不知道如何记录使用remember-me功能登录的用户。我试过重写
createSuccessfulAuthentication(HttpServletRequest request, UserDetails user)
TokenBasedRememberMeServices
的,但随后也会记录注销,因为remember-me服务会重新验证用户身份。
答案 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中将安全过滤器链后的过滤器放入。