Entweder ich etwas fehlt, oder das ist, wie es funktioniert ...
nämlich implementiert ich UserDetailsService
und Unter eingestuft (AppUser
unten) Feder Utility-Klasse User
, (das implementiert UserDetails
). Wenn es darauf ankommt, es geht ungefähr so:Spring-Sicherheit gibt String als Principal statt UserDetails bei fehlgeschlagener Anmeldung zurück?
@Override
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException {
// try loading user by its name
SystemUser user = null;
try {
user = this.sysUserService.getByUsername(username);
if(user == null)
throw new UsernameNotFoundException("User not found!");
}
catch(Exception e) {
throw new DataRetrievalFailureException(
"Could not load user with username: " + username);
}
// load user rights, and create UserDetails instance
UserDetails res = new AppUser(user, getUserAuthorities(user));
return res;
}
Dann habe ich versuchte Konto Verriegelung mit diesem Ansatz zu implementieren:
public class LoginFailureEventListenter implements
ApplicationListener<AuthenticationFailureBadCredentialsEvent> {
// rest omitted for brevity
@Override
public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent event) {
// ...
SystemUser user = ((AppUser)event.getAuthentication().getPrincipal()).getSystemUser();
// cast exception - how is it possible to obtain String
// instead of UserDetails object here ?
// ...
}
}
Allerdings lief ich in java.lang.ClassCastException
beim Versuch, die Hauptaufgabe von der bekommen übergebenes Ereignisargument (Hauptobjekt war vom Typ String
). Ich meine, OK - ich kann nur meine SystemUser
von Benutzernamen erneut laden, um das Problem zu lösen, aber ich habe dies nicht erwartet ...
Ich denke, dass sogar die Quelldokumentationen UserDetails
Instanz für dieses Szenario zurückgeben soll.
Gedanken?
Also ist das eigentlich so, wie es sein soll ...? Ich benutze bereits 'AuthenticationSuccessHandler' für das Zurücksetzen des Zählers, kann nicht sagen, ob dies der richtige Ansatz ist, es ist mir nicht eingefallen, es mit' AuthenticationFailureHandler' zu versuchen. – Less
Ja, so soll es sein. Das Ereignis sagt "Dies ist die Authentifizierungsanforderung, die fehlgeschlagen ist" und die Authentifizierungsanforderung enthält nur eine Zeichenfolge-ID für den Benutzer. –