Ich möchte protokollieren, wenn ein Benutzer versucht, mit falschen Anmeldeinformationen zu authentifizieren. Daher habe ich diese Ereignis-Listener-Klasse zu meinem Projekt hinzugefügt:Spring BadCredentials Ereignis nicht ausgelöst
Problem ist es überhaupt nicht funktioniert. Ich benutze die Standard-Login-Seite von Spring Security. Die Seite zeigt den Fehler "falsche Anmeldeinformationen" an, wenn falsche Anmeldeinformationen verwendet werden. Die oben genannte Methode wird jedoch nicht aufgerufen. ich für einen Erfolg Ereignis-Listener sehr ähnlichen Code haben, die wunderbar funktioniert:
@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!");
}
}
Hier ist meine Spring Security Java-Konfiguration:
@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();
}
}
ich keine Ahnung, was hier los ist, Hilfe zu schätzen ein Menge!
Frühling Version: 4.0.9
Spring Security Version: 3.2.5 (auch 4.0.1 versucht)
Edit:
Okay, setze i -Protokollstufe für Spring debug, aber nichts. Ich habe nach jedem Vorkommen von "Listener" gesucht und im Protokoll steht, dass Instanzen von AuthenticationFailureListener und AuthenticationSuccessListeners fehlerfrei erstellt wurden.
Ich legte sogar das Protokoll in Diff-Tool (nach dem Ersetzen aller Zeiten & Zensur) und verglichen mit einer Code-Version, wo FailureListener Code auskommentiert ist, aber nicht etwas gefunden. Sie können es selbst suchen, wenn Sie möchten:
https://www.diffchecker.com/cwdn4sp4
Am unteren Rand der Seite finden Sie den einfachen Log-Text auf der linken Seite.
Edit2: Teil gelöst
Serges Lösung geholfen, hier ist meine komplette Umsetzung der onAuthenticationFailure Methode:
@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);
}
Haben Sie die richtige Komponente Scan so eingerichtet haben, dass Ihre 'AuthenticationFailureListener' als Bean erstellt wird? Aktivieren Sie Spring Debug-Protokollierung, um zu überprüfen, dass es tatsächlich erstellt wird. Dadurch erhalten Sie/uns weitere Informationen, mit denen Sie arbeiten können. –
Der FailureListener befindet sich im selben Paket wie der SuccessListener, daher sollte scan mit beiden funktionieren. Ill versuchen Debug-Logging jetzt, thx! – Katharsas