Spring Security: LockedException é lançado em vez de BadCredentialsException, por quê?

Usando o Spring Security 4.0.2.RELEASE

Para autenticação básica do usuário usando a estrutura spring-security, implementei spring-securityDaoAuthenticationProvider

Quando o usuário tenta fazer login com o nome de usuário correto,incorreta senha e usuárioconta já está bloqueada, então eu esperava que o módulo de autenticação de segurança de mola estivesse lançandoBadCredentialsException Mas, em vez disso, lançaLockedException

Minhas perguntas são

por que a spring-security está processando o usuário para autenticação adicional enquanto as credenciais, especialmente a senha, estão incorretas?É uma boa prática mostrar a mensagem no aplicativo que "O usuário está bloqueado", mesmo que a senha do usuário seja inválida?Como faço para gerar / capturarBadCredentialsException para senha inválida e usuário bloqueado?

Qualquer ajuda seria apreciada. O código de implementação do provedor de autenticação é

@Component("authenticationProvider")
public class LoginAuthenticationProvider extends DaoAuthenticationProvider {

    @Autowired
    UserDAO userDAO;

    @Autowired
    @Qualifier("userDetailsService")
    @Override
    public void setUserDetailsService(UserDetailsService userDetailsService) {
        super.setUserDetailsService(userDetailsService);
    }

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        try {
            Authentication auth = super.authenticate(authentication);
            // if reach here, means login success, else exception will be thrown

            // reset the user attempts
            userDAO.resetPasswordRetryAttempts(authentication.getName());

            return auth;
        } catch (BadCredentialsException ex) {
            // invalid login, update user attempts
            userDAO.updatePasswordRetryAttempts(authentication.getName(), PropertyUtils.getLoginAttemptsLimit());
            throw ex;
        } catch (LockedException ex) {
            // this user is locked
            throw ex;
        } catch (AccountExpiredException ex) {
            // this user is expired
            throw ex;
        } catch (Exception ex) {
            ex.printStackTrace();
            throw ex;
        }
    }

}

questionAnswers(1)

yourAnswerToTheQuestion