【问题标题】:Injecting UserService into SecurityConfiguration in jhipster leads to spring bean circular dependencyjhipster中将UserService注入SecurityConfiguration导致spring bean循环依赖
【发布时间】:2017-08-04 03:05:08
【问题描述】:

我正在尝试将 jhipster 4 应用程序配置为使用 auth0 进行身份验证。当我最初生成项目时,我选择了 JWT 选项,它似乎工作正常并提供 JWT 支持。我现在要做的是正确处理与 auth0 的集成,方法是读取他们提供的 JWT 令牌并在第一次看到新的 auth0 用户名时创建用户。

为此,我计划将UserService 注入到提供JWTFilter 的jhipster 中,并在第一次看到这样的用户名时创建一个新帐户:

private UserService userService;

public JWTFilter(TokenProvider tokenProvider, UserRepository userRepository, UserService userService) {
    this.tokenProvider = tokenProvider;
    this.userRepository = userRepository;
    this.userService = userService;
}

为了做到这一点,我必须将UserService 添加到JWTConfigurer 的构造函数中,并像这样配置JWTFilter

package com.proj.security.jwt;

import com.proj.repository.UserRepository;
import com.proj.service.UserService;
import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.DefaultSecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

public class JWTConfigurer extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {

    public static final String AUTHORIZATION_HEADER = "Authorization";

    public static final String AUTHORIZATION_TOKEN = "access_token";

    private TokenProvider tokenProvider;

    private UserRepository userRepository;

    private UserService userService;

    public JWTConfigurer(TokenProvider tokenProvider, UserRepository userRepository, UserService userService) {
        this.tokenProvider = tokenProvider;
        this.userRepository = userRepository;
        this.userService = userService;
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        JWTFilter customFilter = new JWTFilter(tokenProvider, userRepository, userService);
        http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class);
    }
}

最后,这个必须注入SecurityConfiguration的构造函数中

public SecurityConfiguration(AuthenticationManagerBuilder authenticationManagerBuilder, UserDetailsService userDetailsService,
        TokenProvider tokenProvider, CorsFilter corsFilter, UserRepository userRepository, UserService userService) {

    this.authenticationManagerBuilder = authenticationManagerBuilder;
    this.userDetailsService = userDetailsService;
    this.tokenProvider = tokenProvider;
    this.corsFilter = corsFilter;
    this.userRepository = userRepository;
    this.userService = userService;
}

并添加到JWTConfigurer bean

private JWTConfigurer securityConfigurerAdapter() {
    return new JWTConfigurer(tokenProvider, userRepository, userService);
}

但是,当我使用 maven 启动应用程序时,出现以下错误:

2017-03-13 22:41:00.816  WARN 45420 --- [  restartedMain] o.s.boot.SpringApplication               : Error handling failed (Error creating bean with name 'delegatingApplicationListener' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.cache.annotation.ProxyCachingConfiguration': Initialization of bean failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' available)
2017-03-13 22:41:00.823 ERROR 45420 --- [  restartedMain] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

The dependencies of some of the beans in the application context form a cycle:

┌─────┐
|  securityConfiguration defined in file [/Users/user/work/proj/target/classes/com/proj/config/SecurityConfiguration.class]
↑     ↓
|  userService defined in file [/Users/user/work/proj/target/classes/com/proj/service/UserService.class]
└─────┘

UserService 不注入SecurityConfiguration,所以我不确定如何解决这个问题。有没有其他方法可以解决这个问题?

【问题讨论】:

    标签: java spring jhipster auth0


    【解决方案1】:

    最后我通过将constructor and setter injection 混合为SecurityConfiguration 类来解决这个问题:

    @Configuration
    @EnableWebSecurity
    @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    
        private final AuthenticationManagerBuilder authenticationManagerBuilder;
    
        private final UserDetailsService userDetailsService;
    
        private UserRepository userRepository;
    
        private final TokenProvider tokenProvider;
    
        private final CorsFilter corsFilter;
    
        private UserService userService;
    
        public SecurityConfiguration(AuthenticationManagerBuilder authenticationManagerBuilder, UserDetailsService userDetailsService,
                TokenProvider tokenProvider, CorsFilter corsFilter, UserRepository userRepository) {
    
            this.authenticationManagerBuilder = authenticationManagerBuilder;
            this.userDetailsService = userDetailsService;
            this.tokenProvider = tokenProvider;
            this.corsFilter = corsFilter;
            this.userRepository = userRepository;
        }
    
        @Autowired
        public void setUserService(UserService userService) {
            this.userService = userService;
        }
    }
    

    一旦我这样做了,我看到构造函数被调用了正确的参数,然后 UserService 被构造,然后注入到 SecurityConfiguration 的设置器中,就像我想要的那样。

    【讨论】:

      猜你喜欢
      • 2014-04-15
      • 2017-04-03
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 2020-04-14
      • 1970-01-01
      • 2013-12-12
      • 1970-01-01
      相关资源
      最近更新 更多