Mi chiedevo cosa sto facendo male qui per autenticare un utente. Ho un'applicazione in cui l'utente esegue diversi passaggi per attivare il proprio account e, in tal caso, vorrei ignorare il modulo di accesso e portarli direttamente nella loro bacheca.Come posso autenticare a livello di codice utente con Spring Security utilizzando DaoAuthenticationProvider
Ecco ciò che la mia funzione di login automatico assomiglia:
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);
}
}
devo utilizzare la classe DaoAuthenticationProvider come il mio provider di autenticazione. Ho verificato che sto ottenendo un modello UserDetails contenente le credenziali corrette, ID, ruoli di autorità, ecc
Quando si chiama il metodo autenticazione mi imbatto in un puntatore nullo da qualche parte lungo la strada nella classe DaoAuthenticationProvider:
org.springframework.security.authentication.AuthenticationServiceException a org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser (DaoAuthenticationProvider.java:109) a org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider. autenticare (AbstractUserDetail sAuthenticationProvider.java:132) a com.bosch.actions.BaseController.doAutoLogin (BaseController.java:659) . . . Causati da: java.lang.NullPointerException a org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser (DaoAuthenticationProvider.java:101)
Sono davvero non sono sicuro che è nullo, come I don' t avere il codice sorgente disponibile
Edit sono riuscito a trovare il codice sorgente qui - https://github.com/SpringSource/spring-security/blob/master/core/src/main/java/org/springframework/security/authentication/dao/DaoAuthenticationProvider.java
sono stato in grado di aggirare il puntatore nullo impostando esplicitamente l'UserDetailsService sull'oggetto:
authenticator.setUserDetailsService(udService);
Ma ora Ottengo un'eccezione di credenziali errate quando so che la password fornita è corretta, perché l'ho vista nel debugger nell'oggetto UserDetails impostato in precedenza nel codice.
org.springframework.security.authentication.BadCredentialsException: Bad credenziali a org.springframework.security.authentication.dao.DaoAuthenticationProvider.additionalAuthenticationChecks (DaoAuthenticationProvider.java:87) a org.springframework.security. authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate (AbstractUserDetailsAuthenticationProvider.java:149)
Primavera di sicurezza è open source, si ha il codice sorgente disponibile. Probabilmente stai avendo problemi perché DaoAuthenticationProvider è progettato per essere un bean gestito a molla. – samlewis