2015-02-07 49 views
6

Lavorare sullo spostamento da Xml di sicurezza di sicurezza a Java Config in Spring Security.Avvio a molla, esclusione di sicurezza a molla UserDetailsService

Nella classe SecurityConfiguration che estende WebSecurityConfigurerAdapter. Tuttavia, il problema è che userDetailsService non viene utilizzato dai filtri di sicurezza in particolare UsernamePasswordAuthenticationFilter. Ho guardato l'avvio e sembra che questo non sia stato creato prima che Spring boots crei il predefinito InMemoryUserDetailsManager.

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

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

     http.userDetailsService(userDetailsService); 

    } 
} 

ho anche cercato di ignorare l'userDetailsServiceBean e userDetailsService in questa classe secondo la consuetudine iniettato ApplicationUserDetailsService.

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

@Override 
public UserDetailsService userDetailsService() { 

    return userDetailsService; 
} 

Tuttavia, quando si tenta di ignorare l'authenticationManagerBean sembra che invoca la mia configurazione prima che la configurazione di avvio di primavera inizializza ma genera un errore (di seguito) che v'è un riferimento circolare durante l'inizializzazione del UsernamePasswordAuthenticationFilter. Ho davvero bisogno di sovrascrivere l'authenticationManagerBean perché devo definire cosa va inserito in UsernamePasswordAuthenticationFilter.

@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 

idee?

risposta

0

Hi c'è modo semplice per eseguire l'override 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")); 
} 
} 

Questo è importante: @Component ("userDetailsService")

Grazie Aleksandar

Problemi correlati