我想在我的 Web 应用程序中记录每次登录。我能够访问发生的登录,UsernamePasswordAuthenticationFilter
但我不知道如何记录使用记住我功能登录的用户。我尝试覆盖
createSuccessfulAuthentication(HttpServletRequest request, UserDetails user)
的TokenBasedRememberMeServices
,但随后也会记录注销,因为 remember-me 服务会重新验证用户身份。
我想在我的 Web 应用程序中记录每次登录。我能够访问发生的登录,UsernamePasswordAuthenticationFilter
但我不知道如何记录使用记住我功能登录的用户。我尝试覆盖
createSuccessfulAuthentication(HttpServletRequest request, UserDetails user)
的TokenBasedRememberMeServices
,但随后也会记录注销,因为 remember-me 服务会重新验证用户身份。
记录身份验证成功和失败的最佳方法是使用 Spring ApplicationListener
。
Spring Security 发布了各种事件来验证身份验证成功和失败,您可以收听这些事件。当拒绝访问资源时,也会发布事件。
你可以看LoggerListener
一个例子。首先将其中之一添加到您的应用程序上下文中,它将自动在警告级别记录身份验证事件。
关于记住我的登录,如果您注销然后立即访问该站点,并使用记住我的 cookie 重新进行身份验证,那么从技术上讲,这与任何其他记住我的身份验证相同,因此您无能为力关于它。
但是,如果您的注销成功 URL 正在通过记住我过滤器,并且这就是创建新会话的方式(无需用户进行任何其他操作),那么只需从安全过滤器链中省略该页面即可。
对于记录每个成功的登录,我认为最好的方法是创建 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>
我认为在您的情况下,当您使用自定义过滤器时将有助于解决方案,它将拦截对您的应用程序的每个请求。在此过滤器中,您可以记录每个请求的用户名。
在这里,我描述了如何添加您的自定义过滤器。您只需要将功能更改为您想要的。并且不要将您的过滤器放在 web.xml 中的安全过滤器链之后。