我对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安全允许这样做,我怎么能在这种情况下实现我的计划呢?
提前谢谢。
答案 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()