@WebMvcTest при использовании безопасности возвращает статус 401 вместо перенаправления - PullRequest
2 голосов
/ 13 мая 2019

Я пишу тест для простого контроллера с Spring Security.Форма входа включена.Когда пользователь вводит /books URL, он перенаправляется на страницу входа.И это то, что я вижу в веб-консоли.GET on /books возвращает 302, затем /login и статус 200.

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = BookController.class)
public class BookControllerIT {

    @Autowired
    private MockMvc mockMvc;

    // ... some mock beans

    @Test
    public void shouldReturnUnauthorizedStatus() throws Exception {
        mockMvc.perform(get("/books")).andExpect(status().is3xxRedirection());
    }
}

Вот моя конфигурация безопасности:

@Configuration
@EnableWebSecurity
public class BasicSecurityConfiguration extends WebSecurityConfigurerAdapter {

    private DataSource dataSource;
    private BCryptPasswordEncoder encoder;

    @Autowired
    public BasicSecurityConfiguration(@Qualifier("security.datasource") DataSource dataSource, BCryptPasswordEncoder encoder) {
        this.dataSource = dataSource;
        this.encoder = encoder;
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        super.configure(web);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests().antMatchers("/").permitAll()
                .and()
                .authorizeRequests().antMatchers("/h2-console/**").permitAll()
                .anyRequest()
                .authenticated()
                .and()
                .formLogin()
                .and()
                .httpBasic()
                .and()
                .csrf().disable()
                .headers().frameOptions().disable();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
        .jdbcAuthentication()
                .dataSource(dataSource)
                .passwordEncoder(encoder);
    }
}

Почему мой тест не перенаправляется какв браузере ниже?enter image description here

Я попытался добавить @Import(BasicSecurityConfiguration.class) в свой тест, но я все еще получаю 401.

Это версия Spring Boot, которую я использую: springBootVersion = '2.1.0.M2'

1 Ответ

0 голосов
/ 16 мая 2019

Я натолкнулся на обсуждение здесь о том, какой статус должен быть возвращен, когда клиент пытается получить доступ к защищенному ресурсу.Должна ли это быть ошибка клиента или перенаправление.Больше всего меня убеждает ответ, что сервер должен вернуть 401 / 403.

Я проверил, что MockMvc делает в этом случае.Во время фильтрации в FilterSecurityInterceptor выбрасывается AccessDeniedException, а ExceptionTranslationFilter обрабатывает его в handleSpringSecurityException и действительно устанавливает статус ответа на 401.

Я изменяю свой тест, чтобы утверждать, что сервер возвращает статус 4xx.

...