authentifizieren Ich fragte mich, was ich hier falsch mache, um einen Benutzer zu authentifizieren. Ich habe eine Anwendung, bei der der Benutzer mehrere Schritte unternimmt, um seinen Account zu aktivieren, und dabei möchte ich das Login-Formular umgehen und direkt zu seinem Dashboard bringen.Wie kann ich Benutzer mit Spring Security programmatisch mit DaoAuthenticationProvider
Hier ist, was meine automatische Login-Funktion wie folgt aussieht:
protected void automatedLogin(String username, String password, HttpServletRequest request) {
try {
// Must be called from request filtered by Spring Security, otherwise SecurityContextHolder is not updated
CustomUserDetailsService udService = new CustomUserDetailsService(userDAO, request);
UserDetails uDetails = udService.loadUserByUsername(username);
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(uDetails, password);
token.setDetails(new WebAuthenticationDetails(request));
DaoAuthenticationProvider authenticator = new DaoAuthenticationProvider();
Authentication authentication = authenticator.authenticate(token);
SecurityContextHolder.getContext().setAuthentication(authentication);
} catch (Exception e) {
e.printStackTrace();
SecurityContextHolder.getContext().setAuthentication(null);
}
}
ich die DaoAuthenticationProvider Klasse als meine Authentifizierungsanbieter verwenden. Ich habe festgestellt, dass ich ein Userdetails Modell bin immer die richtigen Anmeldeinformationen enthält, ID, Autorität Rollen usw.
Wenn es die authenticate Methode ruft ich auf dem Weg in die DaoAuthenticationProvider Klasse in einen Null-Zeiger irgendwo laufen:
org.springframework.security.authentication.AuthenticationServiceException bei org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser (DaoAuthenticationProvider.java:109) bei org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider. authentifizieren (AbstractUserDetail sAuthenticationProvider.java:132) unter com.bosch.actions.BaseController.doAutoLogin (BaseController.java:659) . . . Verursacht durch: java.lang.NullPointerException bei org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser (DaoAuthenticationProvider.java:101)
Ich bin wirklich nicht sicher, was null ist, wie ich don‘ t haben den Quellcode verfügbar.
bearbeiten konnte ich hier den Quellcode finden - https://github.com/SpringSource/spring-security/blob/master/core/src/main/java/org/springframework/security/authentication/dao/DaoAuthenticationProvider.java
ich in der Lage war, indem Sie explizit um die Null-Zeiger zu erhalten auf dem Objekt die UserDetailsService Einstellung:
authenticator.setUserDetailsService(udService);
Aber jetzt Ich erhalte eine Ausnahme für ungültige Anmeldeinformationen, wenn ich weiß, dass das angegebene Kennwort korrekt ist, weil ich es im Debugger im Objekt "UserDetails" gesehen habe, das zuvor im Code festgelegt wurde.
org.springframework.security.authentication.BadCredentialsException: Bad Anmeldeinformationen bei org.springframework.security.authentication.dao.DaoAuthenticationProvider.additionalAuthenticationChecks (DaoAuthenticationProvider.java:87) bei org.springframework.security. authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate (AbstractUserDetailsAuthenticationProvider.java:149)
Spring Security ist Open Source, was Sie tun zur Verfügung, den Quellcode haben. Wahrscheinlich haben Sie Probleme, da DaoAuthenticationProvider als federverwaltete Bean konzipiert ist. – samlewis