2015-02-07 148 views
6

正在從Spring Security xml配置轉移到Spring Security中的Java Config。Spring Security,彈簧安全覆蓋UserDetailsS​​ervice

在我的類SecurityConfiguration擴展WebSecurityConfigurerAdapter。但是,問題在於userDetailsS​​ervice沒有被安全過濾器特別是UsernamePasswordAuthenticationFilter使用。我查看了啓動,看起來這不是在Spring引導創建默認的InMemoryUserDetailsManager之前創建的。

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

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

     http.userDetailsService(userDetailsService); 

    } 
} 

我也曾嘗試使用注射ApplicationUserDetailsS​​ervice定製覆蓋userDetailsS​​erviceBean和UserDetailsS​​ervice的這一類。

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

@Override 
public UserDetailsService userDetailsService() { 

    return userDetailsService; 
} 

然而,當我嘗試重寫authenticationManagerBean它看起來像它會調用我的配置春天開機初始化配置之前,但它拋出一個錯誤(如下圖),有一個循環引用初始化UsernamePasswordAuthenticationFilter時。我是否真的需要重寫authenticationManagerBean,因爲我需要定義進入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 

想法?

回答

0

您好簡單方法來覆蓋的UserDetailsS​​ervice

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

這一點很重要:@Component( 「UserDetailsS​​ervice中」)

感謝 亞歷山大