如何禁用Okta自动配置进行测试?

时间:2020-07-01 17:19:38

标签: spring-boot spring-security okta

我正在使用this Okta Spring Boot starter,但是我不能为集成测试禁用自动配置。通常,您会执行以下操作:

@SpringBootTest
@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class, OktaOAuth2AutoConfig.class })
class ApplicationTests {

    @Test
    void contextLoads() {
    }
}

但是,OktaOAuth2AutoConfig类受程序包保护,您不能禁用它。我已经尝试了组件扫描过滤器和许多其他技术,但是问题是它仍在加载并需要okta.oauth2.issuer(以及客户端ID和密码)并调用它以确保它是有效的OAuth2提供程序。我不想使用此功能,以防测试必须在自动配置无法调用发行者的地方运行。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您应该能够模拟事物,以便可以进行OIDC发现。我在this blog post中演示了如何为JHipster应用程序执行此操作。由于您使用的是Okta Spring Boot启动器,因此我猜您可以执行类似的操作。

  1. 创建一个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