2013-08-01 33 views
8

Zastanawiam się, co robię źle tutaj, aby uwierzytelnić użytkownika. Mam aplikację, w której użytkownik przechodzi przez kilka kroków, aby aktywować swoje konto, a kiedy to zrobię, chciałbym ominąć formularz logowania i przenieść go bezpośrednio na jego pulpit.W jaki sposób programowo uwierzytelniać użytkownika przy użyciu Spring Security przy użyciu obiektu DaoAuthenticationProvider

Oto co mój zautomatyzowana funkcja logowania wygląda następująco:

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); 
     } 

    } 

muszę użyć klasy DaoAuthenticationProvider jako mojego dostawcy uwierzytelniania. I sprawdzeniu, że jestem coraz model UserDetails zawierający odpowiednie uprawnienia, ID, role władz itp

Kiedy wywoływana jest metoda uwierzytelnienia ja napotkasz pustego wskaźnika gdzieś po drodze w klasie DaoAuthenticationProvider:

org.springframework.security.authentication.AuthenticationServiceException w org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser (DaoAuthenticationProvider.java:109) w org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider. authenticate (AbstractUserDetail sAuthenticationProvider.java:132) pod adresem com.bosch.actions.BaseController.doAutoLogin (BaseController.java:659) . . . Spowodowane przez: java.lang.NullPointerException na org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser (DaoAuthenticationProvider.java:101)

jestem naprawdę nie wiem, co jest null, jak don” t mieć dostępny kod źródłowy.

Edit udało mi się znaleźć kod źródłowy tutaj - https://github.com/SpringSource/spring-security/blob/master/core/src/main/java/org/springframework/security/authentication/dao/DaoAuthenticationProvider.java

udało mi się obejść Null Pointer jawnie ustawienie UserDetailsService na obiekcie:

authenticator.setUserDetailsService(udService); 

ale teraz Otrzymuję wyjątek zły poświadczeń, gdy wiem, że podane hasło jest poprawne, ponieważ widziałem je w debugerze w obiekcie UserDetails ustawionym wcześniej w kodzie.

org.springframework.security.authentication.BadCredentialsException: Bad poświadczenia w org.springframework.security.authentication.dao.DaoAuthenticationProvider.additionalAuthenticationChecks (DaoAuthenticationProvider.java:87) w org.springframework.security. authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate (AbstractUserDetailsAuthenticationProvider.java:149)

+0

Wiosna Bezpieczeństwo jest open source, masz kod źródłowy. Prawdopodobnie masz problemy, ponieważ DaoAuthenticationProvider został zaprojektowany jako komponent bean zarządzany przez sprężynę. – samlewis

Odpowiedz

9

udało mi się uwierzytelnienie sprawne zszywania wszystkie właściwości określone w definicji ziarna jarej i SE ich programowo w obiekcie DaoAuthenticationProvider. Patrząc wstecz wygląda na to, że mogło to być głupie pytanie, ale mam nadzieję, że pomoże komuś!

Poprawione Kod:

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

Cieszę się, że znalazłeś poprawkę, ale szczerze mówiąc, nie chodzi o to, jak powinno się używać Spring Security. Sam wykonujesz dużo pracy, której nie powinieneś. – Akshay

+0

Nie jest to normalne użycie aplikacji Spring Security w aplikacji. Jest to jednorazowa instancja, w której muszę zalogować użytkownika bez podawania poświadczeń w formularzu. Za każdym razem będą logować się za pomocą formularza, a fasola Spring Security wykona pracę. Po wyjaśnieniu tego, jeśli jesteś tym, który zajął się odpowiedzią, mam nadzieję, że zmienisz zdanie, ponieważ myślę, że to niesprawiedliwie szkodzi mojej reputacji w StackOverflow. – rawkfist0215

+0

Zapewniam, mój przyjacielu, że nie głosowałem. Nie sądzę, żeby odpowiedź była niepoprawna, sugerowałem tylko, że Spring Security nie ma być używana w ten sposób. I P.S. Głosowanie w dół obniżyłoby moją reputację również na SO :) :) – Akshay