Ho cercato di far funzionare @AuthenticationPrincipal correttamente con una classe utente personalizzata. Sfortunatamente, l'utente è sempre nullo. Ecco il codice:Spring Security @AuthenticationPrincipal
controller
@RequestMapping(value = "/", method = RequestMethod.GET)
public ModelAndView index(@AuthenticationPrincipal User user) {
ModelAndView mav= new ModelAndView("/web/index");
mav.addObject("user", user);
return mav;
}
Security Config
@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
CustomUserDetailsService customUserDetailsService;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(customUserDetailsService).passwordEncoder(passwordEncoder());
}
}
CustomUserDetailsService
@Component
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// Spring Data findByXY function
return userRepository.findByUsername(username);
}
dell'impresa utilizzatrice
public class User implements UserDetails{
private String username;
private String password;
private Collection<Authority> authorities;
// Getters and Setters
}
Autorità Entity
public class Authority implements GrantedAuthority{
private User user;
private String role;
// Getters and Setters
@Override
public String getAuthority() {
return this.getRole();
}
}
Ho provato varie soluzioni a questo ho trovato in rete, per esempio convertendo il mio oggetto utente personalizzato come questo:
return new org.springframework.security.core.userdetails.User(user.getLogin(), user.getPassword(), true, true, true, true, authorities);
Gli altri modi per ottenere gli utenti attivi stanno lavorando senza un problema, ma ho trovato il @AuthenticationProvider CustomUserObject di essere il modo più pulito, che è il motivo per cui vorrei ottenere questo per funzionare. Qualsiasi aiuto è molto apprezzato.
Beh .. si può sempre ottenere 'oggetto Principal', ottenere il nome del preside e trovare l'utente per nome utente. Se primavera sec. l'autenticazione viene implementata correttamente, naturalmente. –
Sì, questo è quello che sto facendo al momento ... Autenticazione auth = SecurityContextHolder.getContext(). GetAuthentication(); \t \t User principal = uRep.findByUsername (auth.getName()); .. ma come ho detto, mi piacerebbe avere quella soluzione pulita quando è disponibile – Lukehey
Sto affrontando esattamente lo stesso problema come te. @ AuthenticationPrincipal mi dà sempre un utente predefinito (la classe User è appena inizializzata con il costruttore predefinito), mentre ContextSecurityHolder e HttpServletRequest # getUserPrincipal() mi danno l'utente previsto (autenticato). A proposito, non dovresti annotare il tuo SecurityConfig con @ EnableWebSecurity invece di @ EnableWebMvcSecurity (deprecato in Spring Security 4+)? –