2015-03-29 17 views
6

Ich habe einige Probleme mit Spring-Sicherheitsauthentifizierung. Überall in meiner Anwendung funktioniert alles super (CRUD-Operationen funktionieren gut), aber der Anmeldeversuch schlägt fehl.Spring Security-Authentifizierung mit UserDetailsService

Hier ist mein Code (I mit Kommentaren unten markiert, wo userDAO null ist, die Ursache der fehlgeschlagenen Authentifizierung):

@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 

Meine SecurityConfig sieht aus wie dieses

@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 

ich, wo ich NPE markiert bekommen und ich habe keine Ahnung, wie ich das lösen kann. Whole-Konfiguration ist JavaBased und Sie können es hier draußen, um weitere Informationen Besuche HERE

EDIT: GetUsers() wird auf diese Weise in Controller aufgerufen:

@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; 
    } 

Und in diesem Fall (beim Aufruf userService.getUsers()) userDAO ist nicht null

versucht, es zu beheben wie Bohuslav Burghardt vorgeschlagen und ich habe

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 

in Zeile auth.userDetailsService (userService);

Antwort

2

Problem mit diesem Stück Code von Bohuslav gelöst

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

auch

fehlt
@ComponentScan("com.gi") 

vor

public class SecurityConfig extends WebSecurityConfigurerAdapter { 

Mangel davon verursacht

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

Dies ist der Teil, der nicht korrekt ist:

UserServiceImpl userService = new UserServiceImpl(); 

Wenn Sie den Dienst instanziiert selbst, seine autowired Abhängigkeiten immer null sein wird. Sie müssen die Federbehälter lassen es instanziiert (bereits erfolgt durch den Dienst mit @Service Markierung) und injizieren es dann in der Sicherheitskonfiguration Klasse wie folgt:

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

Als ich versuchte, es zu beheben Ihren Weg zeigte Fehler: (24, 13) java: Methode userDetailsService in Klasse org.springframework.security.config.annotation. authentication.builders.AuthenticationManagerBuilder kann nicht auf bestimmte Typen angewendet werden; erforderlich: T gefunden: com.gi.service.UserService Grund: gefolgert Typ nicht entspricht obere Grenze (n) gefolgert: com.gi.service.UserService obere Grenze (n): org.springframework.security .core.benutzerdetails.UserDetailsService – dklos

+1

@d__k Sie können es auf eine von drei Arten beheben: 1) Autowire den Dienst als private UserDetailsService userService, 2) Ihre UserService-Schnittstelle erweitern Sie die UserDetailsService-Schnittstelle und dann implementieren Ihre Implementierungsklassen einfach UserService oder 3) Cast UserService zu UserDetailsService in der Konfigurationsklasse –

+0

Erprobt beide Möglichkeiten und bekam: ' Keine qualifizierende Bean des Typs [com.gi.service.UserService] für die Abhängigkeit gefunden: erwartet mindestens 1 Bean, die als Autowire-Kandidat für diese Abhängigkeit qualifiziert. – dklos

Verwandte Themen