Spring Security: LockedException é lançado em vez de BadCredentialsException, por quê?
Usando o Spring Security 4.0.2.RELEASE
Para autenticação básica do usuário usando a estrutura spring-security, implementei spring-securityDaoAuthenticationProvider
Quando o usuário tenta fazer login com o nome de usuário correto,incorreta senha e usuárioconta já está bloqueada, então eu esperava que o módulo de autenticação de segurança de mola estivesse lançandoBadCredentialsException
Mas, em vez disso, lançaLockedException
Minhas perguntas são
por que a spring-security está processando o usuário para autenticação adicional enquanto as credenciais, especialmente a senha, estão incorretas?É uma boa prática mostrar a mensagem no aplicativo que "O usuário está bloqueado", mesmo que a senha do usuário seja inválida?Como faço para gerar / capturarBadCredentialsException
para senha inválida e usuário bloqueado?Qualquer ajuda seria apreciada. O código de implementação do provedor de autenticação é
@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;
}
}
}