Spring Security: вместо BadCredentialsException выбрасывается LockedException, почему?

Использование Spring Security 4.0.2.RELEASE

Для базовой аутентификации пользователей с использованием Spring-Security Framework я реализовал Spring-SecurityDaoAuthenticationProvider

Когда пользователь пытается войти с правильным именем пользователя,некорректный пароль и пользовательаккаунт уже заблокирован, тогда я ожидал, что модуль аутентификации Spring-Security будет бросатьBadCredentialsException Но вместо этого он бросаетLockedException

Мои вопросы

Почему Spring-Security обрабатывает пользователя для дальнейшей аутентификации, в то время как учетные данные, особенно пароль, неверны?Рекомендуется ли показывать в приложении сообщение «Пользователь заблокирован», даже если пароль пользователя недействителен?Как мне удается генерировать / ловитьBadCredentialsException за неверный пароль и заблокированного пользователя?

Любая помощь будет оценена. Код реализации провайдера аутентификации

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

}

Ответы на вопрос(1)

Ваш ответ на вопрос