2015-02-07 35 views
6

Làm việc trên di chuyển từ cấu hình xml bảo mật mùa xuân sang Java Config trong Spring Security.Khởi động mùa xuân, ghi đè bảo mật mùa xuân UserDetailsService

Trong lớp SecurityConfiguration của tôi mở rộng WebSecurityConfigurerAdapter. Tuy nhiên, vấn đề là userDetailsService không được sử dụng bởi các bộ lọc bảo mật đặc biệt là UsernamePasswordAuthenticationFilter. Tôi nhìn vào khởi động và có vẻ như điều này không được tạo trước khi khởi động Spring tạo ra InMemoryUserDetailsManager mặc định.

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

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

     http.userDetailsService(userDetailsService); 

    } 
} 

Tôi cũng đã cố gắng ghi đè userDetailsServiceBean và userDetailsService trong lớp này bằng cách sử dụng ApplicationUserDetailsService được tiêm tùy chỉnh.

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

@Override 
public UserDetailsService userDetailsService() { 

    return userDetailsService; 
} 

Tuy nhiên, khi tôi cố gắng để ghi đè lên authenticationManagerBean có vẻ như nó gọi cấu hình của tôi trước khi cấu hình khởi động mùa xuân khởi nhưng nó ném một lỗi (dưới đây) rằng có một tham chiếu vòng tròn khi khởi tạo UsernamePasswordAuthenticationFilter. Tôi có thực sự cần phải ghi đè lên authenticationManagerBean vì tôi cần phải xác định những gì đi vào 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 

Ý tưởng?

Trả lời

0

Hi có cách đơn giản để ghi đè 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")); 
} 
} 

này rất quan trọng: @Component ("userDetailsService")

Cảm ơn Aleksandar

Các vấn đề liên quan