onAuthenticationSuccess未被调用

时间:2013-08-29 09:27:10

标签: java spring spring-mvc spring-security

在我的应用程序中,我有三种方式登录用户 表格登录, 自动登录和 记住我的饼干。

我必须在成功验证用户后拦截呼叫,因为我使用 AuthenticationSuccessHandler 来拦截呼叫。

我正在使用spring security来验证用户身份。对于基于表单的登录,我在spring-security.xml

中配置了以下代码
form-login login-page="/login/formlogin" default-target-url="/login/user_login" 
                 authentication-failure-url="/login/loginfailed" 
authentication-success-handler-ref="authenticationSuccessHandlerImpl"/>

AuthenticationSuccessHandler.onAuthenticationSuccess();
验证成功完成后立即调用

,但是 对于自动登录,永远不会调用此方法。

对于autologin用户将邮寄一个URL,点击该URL将验证用户,我正在以编程方式进行。在URL中,我将加密用户名(无密码)。 我在点击URL(自动登录)时使用以下代码行来验证用户

Authentication authentication = new UsernamePasswordAuthenticationToken(userName, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);

但是,

AuthenticationSuccessHandler.onAuthenticationSuccess()
在这种情况下,

永远不会被调用。

是否有其他方法可以拦截成功身份验证时的呼叫。

1 个答案:

答案 0 :(得分:1)

您可以在两种情况下重复使用现有的auth成功处理程序。记住我 - 只需配置它:

<remember-me authentication-success-handler-ref="authenticationSuccessHandlerImpl"/>

自动登录 - 注入相同的auth成功处理程序bean并在手动代码后调用它:

Authentication authentication = new UsernamePasswordAuthenticationToken(userName, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
successHandler.onAuthenticationSuccess(request, response, authentication);