Тесты Spring Security x509 не работают, как я ожидал - PullRequest
0 голосов
/ 29 августа 2018

У меня есть простое приложение, делающее взаимный TLS . На практике при запуске приложения все работает, как я ожидаю.

Однако этот следующий тест не работает, и я хотел бы понять, почему, как это кажется в цепочке безопасности, но конфигурация truststore , похоже, полностью игнорируется.

@ActiveProfiles("test")
@RunWith(SpringRunner.class)
@ContextConfiguration
@WebMvcTest
public class ConfigurationTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext context;

    @Before
    public void setup() {
        mockMvc = MockMvcBuilders
                .webAppContextSetup(context)
                .apply(springSecurity())
                .build();
    }


    public void untrustedClientShouldBeForbidden() throws Exception {

        this.mockMvc.perform(get("/v1/load")

        .with(x509(getCertificateFromFile("src/test/resources/untrusted-cert.pem")))
        .accept(MediaType.APPLICATION_JSON)
        .contentType(MediaType.APPLICATION_JSON)
        .content("{\"foo\":\"bar\"}"))
        .andDo(print())
        .andExpect(status().is(HttpStatus.FORBIDDEN.value()));
    }

Конфигурация безопасности, которую я имею, очень проста и выглядит следующим образом:

@Override
    protected void configure(HttpSecurity http) throws Exception {
        //disable crsf and sessions for this web app
        http.httpBasic().disable().csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER)
          .and().x509()
            .subjectPrincipalRegex("CN=(.*?)(?:,|$)")
            .userDetailsService(userDetailsService());
    }

И моя тестовая конфигурация (которая работает при выполнении ручного тестирования) выглядит следующим образом (application-test.properties):

server.ssl.trust-store=src/test/resources/test.truststore
server.ssl.trust-store-password=changeit
server.ssl.key-store-provider=SUN
server.ssl.key-store-type=JKS

РЕДАКТИРОВАТЬ: переименована функция модульного теста, чтобы лучше передать цель теста.

1 Ответ

0 голосов
/ 30 августа 2018

Оказывается, мой тестовый класс не был должным образом аннотирован.

В моем основном классе конфигурации я изменил:

@SpringBootApplication
@PropertySources({
    @PropertySource("classpath:application.properties"),
    @PropertySource("classpath:application-${spring.profiles.active}.properties")})
@ComponentScan("foo.bar.blah")
public class Application {

Кому:

@SpringBootApplication(scanBasePackages="foo.bar.blah")
@PropertySources({
    @PropertySource("classpath:application.properties"),
    @PropertySource("classpath:application-${spring.profiles.active}.properties")})
public class Application {

И в моем тестовом классе я перестал использовать @ MockWebMvc в пользу этой конфигурации:

@ActiveProfiles("test")
@RunWith(SpringRunner.class)
@ContextConfiguration
@SpringBootTest
@AutoConfigureMockMvc
public class ConfigurationTest {

Теперь конфигурация настроена правильно, и модульные тесты ведут себя так, как я ожидал.

...