2014-11-20 103 views
1

我有以下配置:春天循環依賴

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled=true) 
public class SecurityConfig { 
    private static final Logger LOGGER = LoggerFactory.getLogger(SecurityConfig.class); 
    @Resource 
    private UserDetailsService userDetailsService; 
    @Resource 
    private PasswordEncoder passwordEncoder; 

    ..... 

    @Configuration 
    @Order(2) 
    public static class MobileApiSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { 
     @Resource 
     private UserDetailsService userDetailsService; 
     @Resource 
     private PasswordEncoder passwordEncoder; 
     @Autowired 
     private CustomBasicAuthenticationFilter customBasicAuthenticationFilter; 
     @Autowired 
     private TokenSecurityFilter tokenSecurityFilter; 

     protected void configure(AuthenticationManagerBuilder auth) throws Exception { 

      auth 
      .userDetailsService(userDetailsService) 
      .passwordEncoder(passwordEncoder); 

     } 

     protected void configure(HttpSecurity http) throws Exception { 
      http 
       .addFilter(customBasicAuthenticationFilter) 
       .addFilterBefore(tokenSecurityFilter, CustomBasicAuthenticationFilter.class) 
       .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() 
        .csrf().disable() 
       .authorizeRequests()   
        .antMatchers(Mappings.MOBILE_API + "/**").hasAnyRole(Globals.MOBILE_API_USER_ROLE) 
        .and() 
       .exceptionHandling() 
        .authenticationEntryPoint(new CustomBasicAuthenticationEntryPoint()) 
        .and() 
       .requestCache() 
        .requestCache(new NullRequestCache()); 
     } 

    } 

這是我的自定義過濾器:

@Component 
public class CustomBasicAuthenticationFilter extends BasicAuthenticationFilter { 
    private static final Logger LOGGER = LoggerFactory.getLogger(CustomBasicAuthenticationFilter.class); 
    @Autowired 
    private PrincipalRepository principalRepository; 
    @Autowired 
    private AuthenticationCache authenticationCache; 

    @Autowired 
    public CustomBasicAuthenticationFilter(AuthenticationManager authenticationManager) { 
     super(authenticationManager); 
    } 

    @Override 
    protected void onSuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, 
      Authentication authResult) throws IOException { 
     Principal principal = principalRepository.findOne(PrincipalPredicates.userNameEquals(authResult.getName())); 

     if (principal != null) { 
      principal.setLastLoginTime(DateTime.now()); 
      principalRepository.save(principal); 
     } else { 
      LOGGER.error("Unable to retrieve user " + authResult.getName()); 
     } 

     authenticationCache.add(authResult, request, response); 

     super.onSuccessfulAuthentication(request, response, authResult); 
    } 
} 

但是,嘗試部署到Tomcat的時候,下面的異常被拋出:

Error creating bean with name 'customBasicAuthenticationFilter' defined in file [C:\work\...]: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.springframework.security.authentication.AuthenticationManager]: : No qualifying bean of type [org.springframework.security.authentication.AuthenticationManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.security.authentication.AuthenticationManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 

我不確定爲什麼我的過濾器正在尋找一個認證管理器,因爲我自動裝配它。幫助表示讚賞。

更新問:我加入這個代碼來解決的AuthenticationManager問題

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

通過加入以上,我能夠闖過的AuthenticationManager的問題,但現在我得到這個問題:

org.springframework.beans.factory.BeanCreationException: 
Could not autowire field: private CustomBasicAuthenticationFilter SecurityConfig$MobileApiSecurityConfigurerAdapter.customBasicAuthenticationFilter; 
nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: 
Error creating bean with name 'customBasicAuthenticationFilter': 
Requested bean is currently in creation: Is there an unresolvable circular reference? 

感謝

+0

您自動將bean與構造函數連線。你在哪裏告訴bean工廠如何創建AuthenticationManager實例以傳遞給構造函數?這就是它抱怨的。自動佈線構造函數依賴是不夠的;你也必須創建bean來引用。 – duffymo 2014-11-20 21:14:45

+0

感謝您的評論。我想我理解這個問題,但我不知道如何解決它。謝謝。 – Jim 2014-11-20 23:38:10

回答

0

你可以嘗試在上面添加批註@EnableWebSecurityMobileApiSecurityConfigurerAdapter類的定義。

0

我在過濾器中添加了@Lazy註釋,現在我可以部署了。

隨意提供其他解決方案。