[英]Injecting UserService into SecurityConfiguration in jhipster leads to spring bean circular dependency
我正在嘗試將jhipster 4應用程序配置為使用auth0進行身份驗證。 最初生成項目時,我選擇了JWT選項,該選項似乎可以正常工作並提供JWT支持。 我現在想做的是,通過讀取它們提供的JWT令牌並在首次看到新的auth0用戶名時創建一個用戶,來正確處理與auth0的集成。
為此,我計划將UserService
注入jhipster提供的JWTFilter
並在首次看到用戶名時創建一個新帳戶,如下所示:
private UserService userService;
public JWTFilter(TokenProvider tokenProvider, UserRepository userRepository, UserService userService) {
this.tokenProvider = tokenProvider;
this.userRepository = userRepository;
this.userService = userService;
}
為此,我必須將UserService
添加到JWTConfigurer
的構造函數中, 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
,因此我不確定如何解決此問題。 是否有其他方法可以解決此問題?
最后,我通過將SecurityConfiguration
類的構造函數和setter注入混合來解決了這個問題,如下所示:
@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
的設置器中,如我所願。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.