我正在使用this Okta Spring Boot starter,但是我不能为集成测试禁用自动配置。通常,您会执行以下操作:
@SpringBootTest
@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class, OktaOAuth2AutoConfig.class })
class ApplicationTests {
@Test
void contextLoads() {
}
}
但是,OktaOAuth2AutoConfig类受程序包保护,您不能禁用它。我已经尝试了组件扫描过滤器和许多其他技术,但是问题是它仍在加载并需要okta.oauth2.issuer
(以及客户端ID和密码)并调用它以确保它是有效的OAuth2提供程序。我不想使用此功能,以防测试必须在自动配置无法调用发行者的地方运行。有什么想法吗?
答案 0 :(得分:1)
您应该能够模拟事物,以便可以进行OIDC发现。我在this blog post中演示了如何为JHipster应用程序执行此操作。由于您使用的是Okta Spring Boot启动器,因此我猜您可以执行类似的操作。
TestSecurityConfiguration.java
类。@TestConfiguration
public class TestSecurityConfiguration {
private final ClientRegistration clientRegistration;
public TestSecurityConfiguration() {
this.clientRegistration = clientRegistration().build();
}
@Bean
ClientRegistrationRepository clientRegistrationRepository() {
return new InMemoryClientRegistrationRepository(clientRegistration);
}
private ClientRegistration.Builder clientRegistration() {
Map<String, Object> metadata = new HashMap<>();
metadata.put("end_session_endpoint", "https://example.org/logout");
return ClientRegistration.withRegistrationId("okta")
.redirectUriTemplate("{baseUrl}/{action}/oauth2/code/{registrationId}")
.clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
.scope("read:user")
.authorizationUri("https://example.org/login/oauth/authorize")
.tokenUri("https://example.org/login/oauth/access_token")
.jwkSetUri("https://example.org/oauth/jwk")
.userInfoUri("https://api.example.org/user")
.providerConfigurationMetadata(metadata)
.userNameAttributeName("id")
.clientName("Client Name")
.clientId("client-id")
.clientSecret("client-secret");
}
@Bean
JwtDecoder jwtDecoder() {
return mock(JwtDecoder.class);
}
@Bean
public OAuth2AuthorizedClientService authorizedClientService(ClientRegistrationRepository clientRegistrationRepository) {
return new InMemoryOAuth2AuthorizedClientService(clientRegistrationRepository);
}
@Bean
public OAuth2AuthorizedClientRepository authorizedClientRepository(OAuth2AuthorizedClientService authorizedClientService) {
return new AuthenticatedPrincipalOAuth2AuthorizedClientRepository(authorizedClientService);
}
}
然后在使用@SpringBootTest
的类中,将该类配置为配置源。
@SpringBootTest(classes = {YourMainApp.class, TestSecurityConfiguration.class})
另一篇博客文章The Hitchhiker's Guide to Testing Spring Boot APIs and Angular Components with WireMock, Jest, Protractor, and Travis CI中提供了有关用于测试的模拟API的其他信息。具体来说,请参见Mock Okta’s API with WireMock。