Desidero registrare se un utente tenta di autenticare con credenziali errate. Quindi ho aggiunto questa classe listener di eventi al mio progetto:Spring BadCredentials Evento non attivo
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.security.authentication.event.AuthenticationFailureBadCredentialsEvent;
import org.springframework.stereotype.Component;
@Component
public class AuthenticationFailureListener
implements ApplicationListener<AuthenticationFailureBadCredentialsEvent>{
private final Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent event) {
System.out.println("test");
logger.info("test2");
}
}
Problema è che non funziona affatto. Uso la pagina di accesso predefinita di Spring Security. La pagina mostra l'errore "cattive credenziali" quando si utilizzano credenziali errate, ma il mio metodo sopra non viene richiamato. Ho codice molto simile per un ascoltatore successo dell'evento, che funziona a meraviglia:
@Component
public class AuthenticationSuccessListener implements
ApplicationListener<InteractiveAuthenticationSuccessEvent> {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired private UserService users;
@Override
public void onApplicationEvent(InteractiveAuthenticationSuccessEvent event) {
User user = users.get(event.getAuthentication().getName());
boolean isAdmin = user.getRole().equals(User.ROLE_ADMIN);
logger.info((isAdmin ? "Admin" : "User") + " with id " + user.getIdLink()
+ " has successfully logged in!");
}
}
Ecco la mia Primavera configurazione della protezione Java:
@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{
@Autowired
private CustomUserDetailsService userDetailsService;
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.formLogin()
.and()
.httpBasic();
}
}
non ho idea di che cosa sta succedendo qui, l'aiuto ha apprezzato un sacco! Versione
Primavera: 4.0.9
Primavera di sicurezza Versione: 3.2.5 (anche provato 4.0.1)
Edit:
Va bene, ho impostato il livello di log per eseguire il debug per la primavera, ma niente. Ho cercato ogni occorrenza di "Listener" e il log afferma che le istanze di AuthenticationFailureListener e AuthenticationSuccessListeners sono state create senza errori.
Ho persino inserito il registro nello strumento diff (dopo aver sostituito tutte le volte & censura) e confrontato con una versione di codice in cui il codice FailureListener è stato commentato, ma non ha trovato nulla. Puoi cercarlo da solo se vuoi:
https://www.diffchecker.com/cwdn4sp4
Nella parte inferiore della pagina troverai il testo del registro semplice sul lato sinistro.
Edit2: parzialmente risolto
soluzione Serges aiutato, ecco la mia completa implementazione del metodo onAuthenticationFailure:
@Override
public void onAuthenticationFailure(
HttpServletRequest request, HttpServletResponse response,
AuthenticationException exception) throws IOException, ServletException {
if (exception instanceof BadCredentialsException) {
String name = request.getParameter("username");
String password = request.getParameter("password");
Authentication auth =
new UsernamePasswordAuthenticationToken(name, password);
eventPublisher.publishEvent(
new AuthenticationFailureBadCredentialsEvent(auth, exception));
}
super.onAuthenticationFailure(request, response, exception);
}
Possiedi una corretta scansione componente impostato in modo che il vostro 'AuthenticationFailureListener' viene creato come un fagiolo? Abilitare la registrazione debug Spring per verificare che sia stata effettivamente creata. Questo ti darà qualche informazione in più con cui lavorare. –
FailureListener si trova nello stesso pacchetto di SuccessListener, pertanto la scansione dovrebbe funzionare con entrambi. Mi piacerebbe provare la registrazione di debug ora, grazie! – Katharsas