Spring security 使用Spring Security记录登录

Spring security 使用Spring Security记录登录,spring-security,Spring Security,我想记录我的web应用程序中的每个登录。我可以通过UsernamePasswordAuthenticationFilter访问登录,但我不知道如何记录使用“记住我”功能登录的用户。我试着越过那条路 createSuccessfulAuthentication(HttpServletRequest request, UserDetails user) 对于TokenBasedMemberMeservices,但也会记录注销,因为“记住我”服务会重新验证用户身份。我认为在您的情况下,当您使用自定义

我想记录我的web应用程序中的每个登录。我可以通过
UsernamePasswordAuthenticationFilter
访问登录,但我不知道如何记录使用“记住我”功能登录的用户。我试着越过那条路

createSuccessfulAuthentication(HttpServletRequest request, UserDetails user)

对于
TokenBasedMemberMeservices
,但也会记录注销,因为“记住我”服务会重新验证用户身份。

我认为在您的情况下,当您使用自定义筛选器时,这将有助于解决此问题,该筛选器将拦截对应用程序的每个请求。在此筛选器中,您可以为每个请求记录用户名


。您只需将功能更改为所需。在web.xml中,不要将过滤器放在安全过滤器链之后。

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

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

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

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


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

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

@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>
@服务
公共类LoginsAccessHandler扩展
SavedRequestStataWareAuthenticationSuccessHandler{
@凌驾
验证成功时公共无效(HttpServletRequest请求,
HttpServletResponse(响应、身份验证)
抛出ServletException、IOException{
User=(用户)身份验证。getPrincipal();
//记录用户登录成功
super.onAuthenticationSuccess(请求、响应、身份验证);
}
}