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