Spring 从外部 jar 注入接口
Spring interface injection from external jar
我在外部库中有 spring API 基于身份验证 类,
以下是外部库中的一些类,
package com.security;
import org.springframework.security.authentication.AuthenticationProvider;
@Component
public class ApiKeyAuthenticationProvider implements AuthenticationProvider {
private static final Logger LOGGER = LoggerFactory.getLogger(ApiKeyAuthenticationProvider.class);
private ApiAuthCredentialsConfig apiAuthCredentialsConfig;
public ApiKeyAuthenticationProvider(ApiAuthCredentialsConfig apiAuthCredentialsConfig) {
this.apiAuthCredentialsConfig = apiAuthCredentialsConfig;
}
}
ApiAuthCredentialsConfig:
package com.security;
public interface ApiAuthCredentialsConfig {
String getAuthToken();
String getAuthTokenHeaderName();
}
并且在 repo 中我添加了上述外部库作为 gradle 依赖项。
我在实际回购中有以下变化。
@Component
@Data
public class ApiAuthenticationConfig implements ApiAuthCredentialsConfig {
@Value("${auth-token}")
private String authToken;
@Value("${auth-token-header-name}")
private String authTokenHeaderName;
}
安全配置:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private ApiKeyAuthenticationProvider apiKeyAuthenticationProvider;
@Override
public void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.
antMatcher("/**").
csrf().disable().
sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).
and().addFilterBefore(new ApiKeyAuthenticationFilter(authenticationManager(), apiKeyAuthenticationProvider.getHeaderName()), AnonymousAuthenticationFilter.class)
.authorizeRequests().anyRequest().authenticated();
}
@Bean
public AuthenticationManager authenticationManager() {
return new ProviderManager(Collections.singletonList(apiKeyAuthenticationProvider));
}
}
申请:
@SpringBootApplication(scanBasePackages = {"com.security"})
@EnableSwagger2
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
当我 运行 应用程序失败并出现以下错误时
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of constructor in com.security.ApiKeyAuthenticationProvider required a bean of type 'com.security.ApiAuthCredentialsConfig' that could not be found.
如何解决这个问题?
在上面的评论之后,我意识到 ApiAuthenticationConfig
与 ApiAuthCredentialsConfig
不在同一个包中,在我将 ApiAuthenticationConfig
移动到 com.security
包后它开始工作了。
我在外部库中有 spring API 基于身份验证 类,
以下是外部库中的一些类,
package com.security;
import org.springframework.security.authentication.AuthenticationProvider;
@Component
public class ApiKeyAuthenticationProvider implements AuthenticationProvider {
private static final Logger LOGGER = LoggerFactory.getLogger(ApiKeyAuthenticationProvider.class);
private ApiAuthCredentialsConfig apiAuthCredentialsConfig;
public ApiKeyAuthenticationProvider(ApiAuthCredentialsConfig apiAuthCredentialsConfig) {
this.apiAuthCredentialsConfig = apiAuthCredentialsConfig;
}
}
ApiAuthCredentialsConfig:
package com.security;
public interface ApiAuthCredentialsConfig {
String getAuthToken();
String getAuthTokenHeaderName();
}
并且在 repo 中我添加了上述外部库作为 gradle 依赖项。
我在实际回购中有以下变化。
@Component
@Data
public class ApiAuthenticationConfig implements ApiAuthCredentialsConfig {
@Value("${auth-token}")
private String authToken;
@Value("${auth-token-header-name}")
private String authTokenHeaderName;
}
安全配置:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private ApiKeyAuthenticationProvider apiKeyAuthenticationProvider;
@Override
public void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.
antMatcher("/**").
csrf().disable().
sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).
and().addFilterBefore(new ApiKeyAuthenticationFilter(authenticationManager(), apiKeyAuthenticationProvider.getHeaderName()), AnonymousAuthenticationFilter.class)
.authorizeRequests().anyRequest().authenticated();
}
@Bean
public AuthenticationManager authenticationManager() {
return new ProviderManager(Collections.singletonList(apiKeyAuthenticationProvider));
}
}
申请:
@SpringBootApplication(scanBasePackages = {"com.security"})
@EnableSwagger2
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
当我 运行 应用程序失败并出现以下错误时
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of constructor in com.security.ApiKeyAuthenticationProvider required a bean of type 'com.security.ApiAuthCredentialsConfig' that could not be found.
如何解决这个问题?
在上面的评论之后,我意识到 ApiAuthenticationConfig
与 ApiAuthCredentialsConfig
不在同一个包中,在我将 ApiAuthenticationConfig
移动到 com.security
包后它开始工作了。