Spring-Sicherheit: LockedException wird anstelle von BadCredentialsException ausgelöst. Warum?

Verwenden von Spring Security 4.0.2.RELEASE

Für die grundlegende Benutzerauthentifizierung mithilfe des Spring-Security-Frameworks habe ich Spring-Security implementiert.DaoAuthenticationProvider

Wenn der Benutzer versucht, sich mit dem richtigen Benutzernamen anzumelden,falsc Passwort und Benutzeraccount ist bereits gesperrt, dann habe ich erwartet, dass das Spring-Security-Authentifizierungsmodul @ auslösBadCredentialsException Aber stattdessen wirft esLockedException

Meine Fragen sind

Warum verarbeitet spring-security den Benutzer zur weiteren Authentifizierung, während das Kennwort für die Anmeldeinformationen falsch ist?Ist es empfehlenswert, in der Anwendung die Meldung "Benutzer ist gesperrt" anzuzeigen, auch wenn das Kennwort für den Benutzer ungültig ist?Wie schaffe ich es, @ zu generieren / zu fangBadCredentialsException für ungültiges Passwort und gesperrten Benutzer?

Jede Hilfe wäre dankbar. Der Implementierungscode für den Authentifizierungsanbieter lautet

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

}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage