2015-02-07 10 views
6

Arbeiten an der Migration von Frühjahr Sicherheit XML-Konfiguration auf Java Config in Spring Security.Spring Boot, Frühling Sicherheit Override UserDetailsService

In meiner Klasse SecurityConfiguration erweitert WebSecurityConfigurerAdapter. Das Problem besteht jedoch darin, dass der userDetailsService nicht von den Sicherheitsfiltern speziell von UsernamePasswordAuthenticationFilter verwendet wird. Ich schaute auf den Start und es scheint, dass dies nicht erstellt wird, bevor Spring startet den Standard InMemoryUserDetailsManager.

@Configuration 
@EnableWebMvcSecurity 
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) 
     throws Exception { 

     http.userDetailsService(userDetailsService); 

    } 
} 

Ich habe auch versucht, die userDetailsServiceBean und userDetailsService in dieser Klasse außer Kraft zu setzen, die individuelle Verwendung injiziert ApplicationUserDetailsService.

@Bean(name="myUserDetailsBean") 
@Override 
public UserDetailsService userDetailsServiceBean() { 
    return userDetailsService; 
} 

@Override 
public UserDetailsService userDetailsService() { 

    return userDetailsService; 
} 

Allerdings, wenn ich versuche, die authenticationManagerBean außer Kraft zu setzen sieht es aus wie es meine Konfiguration aufruft, bevor die Feder Boot-Konfiguration initialisiert, aber es wirft einen Fehler (siehe unten), dass es eine zirkuläre Referenz ist, wenn die UsernamePasswordAuthenticationFilter initialisiert. Muss ich wirklich die AuthenticationManagerBean überschreiben, weil ich definieren muss, was in den UsernamePasswordAuthenticationFilter geht.

@Bean(name="myAuthenticationManager") 
@Override 
public AuthenticationManager authenticationManagerBean() throws Exception { 
    return super.authenticationManagerBean(); 
} 

..

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter]: Circular reference involving containing bean 'securityBeansConfiguration' - consider declaring the factory method as static for independence from its containing instance. Factory method 'usernamePasswordAuthenticationFilter' threw exception; nested exception is java.lang.IllegalArgumentException: successHandler cannot be null 
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) ~[spring-beans-4.1.4.RELEASE.jar:4.1.4.RELEASE] 
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) ~[spring-beans-4.1.4.RELEASE.jar:4.1.4.RELEASE] 
... 70 common frames omitted 

Ideen?

Antwort

0

Hallo es einfache Art und Weise ist UserDetailsService

import com.dog.care.domain.User; 
import com.dog.care.repository.UserRepository; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.security.core.userdetails.UserDetails; 
import org.springframework.security.core.userdetails.UsernameNotFoundException; 
import org.springframework.stereotype.Component; 
import org.springframework.transaction.annotation.Transactional; 

import javax.inject.Inject; 
import java.util.Optional; 

@Component("userDetailsService") 
public class UserDetailsService implements org.springframework.security.core.userdetails.UserDetailsService { 

private final Logger log = LoggerFactory.getLogger(UserDetailsService.class); 

@Inject 
private UserRepository userRepository; 

@Override 
@Transactional 
public UserDetails loadUserByUsername(final String login) { 
    log.debug("Authenticating {}", login); 
    String lowercaseLogin = login.toLowerCase(); 
    Optional<User> userFromDatabase = userRepository.findOneByLogin(lowercaseLogin); 
    return userFromDatabase.map(user -> { 
     if (!user.getActivated()) { 
      throw new UserNotActivatedException("User " + lowercaseLogin + " was not activated"); 
     } 
     return new CustomUserDetails(user); 
    }).orElseThrow(() -> new UsernameNotFoundException("User " + lowercaseLogin + " was not found in the database")); 
} 
} 

Dies ist wichtig, außer Kraft zu setzen: @Component ("userDetailsService")

Dank Aleksandar

Verwandte Themen