La scorsa settimana ho iniziato ad estendere la classe UserDetails per poter supportare un campo personalizzato. La particolarità di questo campo è che viene riempito con un valore che dipende da un parametro di richiesta. Sono riuscito a implementarlo correttamente (quindi la domanda non si concentra su questo).Spring Security Ouath2: Extended UserDetails non restituito dall'oggetto Principal
Ora il problema è che dopo un login di successo l'oggetto UserDetails viene riempito correttamente (sono stato in grado di vederlo usando un AuthenticationSuccessHandler) e il client riceve un token JWT dal provider OAuth2. Il client tenta quindi di recuperare più dettagli sull'utente visitando l'endpoint "/ uaa/user". Questo è impostato per restituire l'oggetto principale. Ma dopo aver controllato il contenuto dell'oggetto principale, sono stato suppreso che l'oggetto UserDetails fosse mancante. Il metodo getPrincipal() ha restituito solo il nome utente anziché l'oggetto UserDetails.
Secondo this question questo è il risultato di un accesso non riuscito. L'AuthenticationToken (in questo caso un UsernamePasswordAuthenticationToken) viene rifiutato da AuthenticationManager. Non ho idea del perché dovrebbe fare una cosa del genere. L'autenticazione con l'oggetto UserDetails predefinito sembra funzionare correttamente. Qualcuno può aiutarmi a risolvere questo problema?
Alcuni dettagli sulle classi implementate (come menzionato sopra). Alcuni codici sono stati lasciati qui per motivi.
CustomUserDetails
public class CustomUserDetails extends User {
private final Integer custom;
public CustomUserDetails (...default params..., Integer custom) {
super(...default params...);
this.custom = custom;
}
}
CustomUserDetailsService
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Override
public CustomUserDetails loadUserByUsername(String username) throw UsernameNotFoundException {
return new CustomUserDetails(...default params..., 12345);
}
}
configurazione
@Autowired
private CustomUserDetails userDetails;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetails);
}
utente Endpoint
@RequestMapping(value = "/user", method = RequestMethod.GET)
@ResponseBody
public Principal getDetails(Principal user) {
return user;
}
l'oggetto principale tornato qui dovrebbe avere le UserDetails oggetto all'interno di esso e dovrebbe restituire questo al client. Ma invece di quello restituisce solo una stringa con lo username quando chiamate getPrincipal();
Alla fine voglio il JSON restituito dall'endpoint Utente (che restituisce l'oggetto Principio) per contenere il campo personalizzato che ho aggiunto a UserDetails.
Grazie in anticipo.
si può mostrare più particolari o meglio un link al tuo progetto come GitHub? Quindi possiamo facilmente individuare il problema tracciando il codice. – vine
Hai provato '@AuthenticationPrincipal CustomUserDetails details' come argomento del metodo' getDetails'? –
Mi sono completamente dimenticato di questa domanda. Abbiamo finito per utilizzare un approccio diverso per ottenere i dettagli dell'utente (chiamando invece un endpoint microservice utente). Ma per rispondere a questa domanda cercherò di trovare una soluzione che non implichi un'applicazione separata. –