Spring Security: se lanza LockedException en lugar de BadCredentialsException, ¿por qué?

Usando Spring Security 4.0.2.

Para la autenticación básica del usuario utilizando el marco de Spring-Security, implementé Spring-SecurityDaoAuthenticationProvider

Cuando el usuario intenta iniciar sesión con el nombre de usuario correcto,incorrecto contraseña y usuariola cuenta ya está bloqueada, entonces esperaba que el módulo de autenticación de seguridad de primavera lanzaraBadCredentialsException Pero en cambio arrojaLockedException

Mis preguntas son

¿Por qué Spring-Security está procesando al usuario para una mayor autenticación mientras que las credenciales, especialmente la contraseña, son incorrectas?¿Es una buena práctica mostrar un mensaje en la aplicación que dice "El usuario está bloqueado" incluso si la contraseña del usuario no es válida?¿Cómo me las arreglo para generar / capturarBadCredentialsException para contraseña inválida y usuario bloqueado?

Cualquier ayuda sería apreciada. El código de implementación del proveedor de autenticación es

@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;
        }
    }

}

Respuestas a la pregunta(1)

Su respuesta a la pregunta