2015-03-29 10 views
6

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

risposta

2

Problema risolto con questo pezzo di codice da Bohuslav

public class SecurityConfig extends WebSecurityConfigurerAdapter { 
    @Autowired 
    private UserService userService; 
} 

manca anche

@ComponentScan("com.gi") 

prima

public class SecurityConfig extends WebSecurityConfigurerAdapter { 

cui mancanza ha causato

Error:(24, 13) java: method userDetailsService in class org.springframework.security.config.annotation.authentication.builders.Authentic‌​ationManagerBuilder 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 
6

Questa è la parte che non è corretto:

UserServiceImpl userService = new UserServiceImpl(); 

Quando si crea un'istanza del servizio da soli, le sue dipendenze autowired sarà sempre null. È necessario lasciare che il contenitore della molla un'istanza (già fatto contrassegnando il servizio con @Service) e poi iniettare nella tua classe configurazione della sicurezza in questo modo:

public class SecurityConfig extends WebSecurityConfigurerAdapter { 
    @Autowired 
    private UserDetailsService userService; 
} 
+0

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

+1

@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 –

+0

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

Problemi correlati