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