spring security:异常时发送重定向

时间:2016-01-05 14:03:26

标签: java spring-mvc authentication spring-security

我对Spring Security有疑问。

我的想法是,在SM_USER标头错误的情况下,我不想发送未捕获的异常(因为我的类loadUserByUsername的方法CustomUserDetailsService)。

public class CustomUserDetailsService implements UserDetailsService {...}

我想抓住它,然后重定向到默认页面(带有映射my/default/page)并在那里写一条消息文本:再试一次

我已经有了ExceptionResolver,但它只适用于控制器级别而不是更早。

@ControllerAdvice
public class ExceptionResolver {

    @ExceptionHandler(PreAuthenticatedCredentialsNotFoundException.class)       
    public ResponseEntity<?> handleBindException(PreAuthenticatedCredentialsNotFoundException e) {
        log.error(e.getMessage(), e);
        ...
        return response;
    }

    @ExceptionHandler(UsernameNotFoundException.class)      
    public ResponseEntity<?> handleBindException(UsernameNotFoundException e) {
        log.error(e.getMessage(), e);
        ...
        return response;
    }
}

据我所知,我需要为这种情况实现一个新的异常解析器,但是当我尝试在应用程序上下文中构建它时,我的整个程序崩溃了。

@RequestMapping("/resource")
public class GlobalExceptionResolver extends AbstractHandlerExceptionResolver{

@Override
protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse responce, Object handler, Exception exception) {

    try {
        responce.sendRedirect("/my/defualt/page");
    } catch (IOException e) {
        log.error(e);
    }
     ModelAndView mav = new ModelAndView();
     if(exception instanceof PreAuthenticatedCredentialsNotFoundException){
        mav.addObject("errorMessage","This user does not exist");
     }
     else  if(exception instanceof UsernameNotFoundException){
         mav.addObject("errorMessage","This user is too old");
     }
     return mav;
    }
}

那么,请你解释一下,如果Spring安全允许这样做,我怎么能在这种情况下实现我的计划呢?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果您正在使用Spring xml,那么在失败时可以使用@PostConstruct调用一个bean

<sec:form-login authentication-failure-handler-ref="afterLoginFail"

示例AfterLoginFail

public class AfterLoginFail extends SimpleUrlAuthenticationFailureHandler {

    @PostConstruct
    public void init() {
        setDefaultFailureUrl("/login?status=failure");
    }

}

或者,如果您使用javaconfig,请使用formLogin().failureUrl(authenticationFailureUrl).failureHandler()