package ch.rasc.sec.security;
import java.time.LocalDateTime;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.security.authentication.event.AuthenticationFailureBadCredentialsEvent;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import ch.rasc.sec.entity.User;
import ch.rasc.sec.repository.UserRepository;
@Component
public class UserAuthenticationErrorHandler
implements ApplicationListener<AuthenticationFailureBadCredentialsEvent> {
private final UserRepository userRepository;
public UserAuthenticationErrorHandler(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
@Transactional
public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent event) {
Object principal = event.getAuthentication().getPrincipal();
if (principal instanceof String) {
User user = this.userRepository.findByUserName((String) principal);
if (user != null) {
if (user.getFailedLogins() == null) {
user.setFailedLogins(1);
}
else {
user.setFailedLogins(user.getFailedLogins() + 1);
}
if (user.getFailedLogins() > 10) {
user.setLockedOut(LocalDateTime.now().plusMinutes(10));
}
}
else {
LoggerFactory.getLogger(UserAuthenticationErrorHandler.class)
.error("Unknown user login attempt: {}", principal);
}
}
}
}