Ho alcuni problemi con l'autenticazione di sicurezza Spring. Ovunque nella mia applicazione tutto funziona alla grande (le operazioni CRUD funzionano bene), ma il tentativo di accesso fallisce.Autenticazione di sicurezza Spring utilizzando UserDetailsService
Ecco il mio codice (ho segnato qui sotto con i commenti in cui userDAO è nullo, che è causa di autenticazione fallita):
@Service
public class UserServiceImpl implements UserService, UserDetailsService {
@Autowired
UserDAO userDAO;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userDAO.getUserByUsername(username); //userDAO == null Causing NPE
if (user == null)
throw new UsernameNotFoundException("Oops!");
List<SimpleGrantedAuthority> authorities = Arrays.asList(new SimpleGrantedAuthority(user.getRole()));
return new org.springframework.security.core.userdetails
.User(user.getLogin(), user.getPassword(), authorities);
}
@Override
public List<User> getUsers() {
return userDAO.getUsers();//userDAO !=null
}
//rest of code skipped
mio SecurityConfig assomiglia a questo
@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
UserServiceImpl userService = new UserServiceImpl();
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService);
}
//rest of code skipped
ho segnato in cui ottengo NPE e non ho idea di come risolvere questo. Configurazione tutto è JavaBased ed è possibile verificarlo qui per maggiori informazioni HERE
EDIT: getusers() viene richiamato in questo modo in controllore:
@Controller
public class LoginController {
@Autowired
UserService userService;
@RequestMapping(value = "/dashboard")
public ModelAndView userDashboard(){
ModelAndView modelAndView = new ModelAndView("Dashboard");
List<User> userList = userService.getUsers();
modelAndView.addObject("users", userList);
return modelAndView;
}
E in questo caso (quando si richiama userService.getUsers()) userDAO non è nullo
ha cercato di aggiustarlo come Bohuslav Burghardt suggerito e ho ottenuto
method userDetailsService in class org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder cannot be applied to given types;
required: T
found: com.gi.service.UserService
reason: inferred type does not conform to upper bound(s)
inferred: com.gi.service.UserService
upper bound(s): org.springframework.security.core.userdetails.UserDetailsService
nella riga auth.userDetailsService (userService);
Quando ho provato a risolvere il problema il vostro modo ha mostrato Errore: (24, 13) Java: metodo userDetailsService in classe org.springframework.security.config.annotation. authentication.builders.AuthenticationManagerBuilder non può essere applicato a determinati tipi; richiesto: T trovato: com.gi.service.UserService ragione: dedurre tipo non è conforme al limite superiore (s) dedotto: com.gi.service.UserService limite superiore (s): org.springframework.security .core.userdetails.UserDetailsService – dklos
@d__k È possibile risolvere il problema in uno dei tre modi: 1) Autorizzare il servizio come privato UserDetailsService userService, 2) rendere l'interfaccia UserService estendere l'interfaccia UserDetailsService e quindi fare in modo che le classi di implementazione implementino solo UserService o 3) Cast UserService a UserDetailsService nella classe di configurazione –
Provato in entrambi i modi e ottenuto: ' Nessun bean qualificante di tipo [com.gi.service.UserService] trovato per dipendenza: atteso almeno 1 bean che si qualifica come candidato autowire per questa dipendenza. – dklos