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