2013-08-01 11 views
8

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)

+0

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

Antwort

9

konnte ich die Authentifizierung zum Laufen bringen, indem Zusammenstückeln alle Eigenschaften im Frühjahr bean Definition definiert und se sie programmatisch auf das DaoAuthenticationProvider-Objekt zu setzen. Rückblickend scheint das eine dumme Frage gewesen zu sein, aber ich hoffe es hilft jemandem!

Corrected Code:

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); 
      CustomMd5PasswordEncoder passEncoder = new CustomMd5PasswordEncoder(); 
      ReflectionSaltSource saltSource = new ReflectionSaltSource(); 
      saltSource.setUserPropertyToUse("salt"); 
      UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password); 
      token.setDetails(new WebAuthenticationDetails(request)); 
      DaoAuthenticationProvider authenticator = new DaoAuthenticationProvider(); 
      authenticator.setUserDetailsService(udService); 
      authenticator.setPasswordEncoder(passEncoder); 
      authenticator.setSaltSource(saltSource); 
      Authentication authentication = authenticator.authenticate(token); 
      SecurityContextHolder.getContext().setAuthentication(authentication); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      SecurityContextHolder.getContext().setAuthentication(null); 
     } 

    } 
+3

Ich bin froh, dass Sie eine Lösung gefunden haben, aber um ehrlich zu sein, sollte Spring Security nicht verwendet werden. Du machst viel alleine, das solltest du nicht tun müssen. – Akshay

+0

Dies ist nicht die normale Verwendung von Spring Security in der App. Dies ist eine einmalige Instanz, bei der ich den Benutzer anmelden muss, ohne dass die Anmeldeinformationen in einem Formular angezeigt werden. Zu jeder anderen Zeit melden sie sich über das Formular an, und die Spring Security Bean erledigt die Arbeit. Nachdem du das erklärt hast, wenn du derjenige bist, der die Antwort herabgestuft hat, hoffe ich, dass du deine Meinung änderst, weil ich denke, dass es meinen Ruf auf StackOverflow ungerechtfertigt verletzt. – rawkfist0215

+0

Sei versichert, mein Freund, ich habe dich nicht gewählt. Ich glaube nicht, dass die Antwort falsch war. Ich habe nur vorgeschlagen, dass Spring Security nicht so verwendet werden sollte. Und PS Down-Voting würden Sie meinen Ruf auf SO zu reduzieren ... :) – Akshay