使用Spring Security记录登录

Kan*_*ani 6 spring-security

我想记录我的Web应用程序中的每个登录.我能够访问通过登录进行的登录,UsernamePasswordAuthenticationFilter但我不知道如何登录使用remember-me功能登录的用户.我试过压倒了

createSuccessfulAuthentication(HttpServletRequest request, UserDetails user)
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*eep 6

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

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

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

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

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


Jig*_*ekh 6

为了记录每个成功登录,我认为最好的方法是创建LoginSucessHandler并为正常登录和remember-me指定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>
Run Code Online (Sandbox Code Playgroud)