Включение Spring Security заставляет Swagger выводить текст/обычный текст вместо HTML

Сваггер работает! Я могу взаимодействовать с http://localhost:8090/sdoc.jsp, и все в порядке.

Я добавляю следующее в pom.xml...

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Я также добавляю следующие два файла:

@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        String name = authentication.getName();
        String password = authentication.getCredentials().toString();

        if( !Authenticate.authenticate(name, password) )
            return null;

        List<GrantedAuthority> grantedAuths = new ArrayList<>();
        grantedAuths.add(new SimpleGrantedAuthority("ROLE_USER"));
        Authentication auth = new UsernamePasswordAuthenticationToken(name, password, grantedAuths);
        return auth;
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }
}

а также

@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
                .disable()

            .authorizeRequests()
                .anyRequest().permitAll()
                .antMatchers("/**").authenticated().and()
                .formLogin().loginPage("/login").permitAll().and()
                .httpBasic()
                ;
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(new CustomAuthenticationProvider());
    }
}

В этот момент, если я посещаю тот же URL-адрес, который ранее работал, я теперь вместо этого получаю тип ответа «текст/обычный», и вместо красивого HTML-браузера я вижу исходный код.

Если я верну изменение и удалю два файла из проекта и удалю файл JAR, он снова сработает.

Как заставить Spring Security и Swagger играть хорошо? Что я делаю не так.


person redboy    schedule 04.02.2015    source источник


Ответы (2)


Я подозреваю, что это связано с влиянием Spring-Security на заголовки типа содержимого (http://docs.spring.io/spring-security/site/docs/3.2.0.CI-SNAPSHOT/reference/html/headers.html#headers-content-type-options).

Из документов -

Исторически сложилось так, что браузеры, в том числе Internet Explorer, пытались угадать тип контента запроса, используя сниффинг контента. Это позволило браузерам улучшить взаимодействие с пользователем, угадывая тип контента на ресурсах, для которых тип контента не указан. Например, если браузер обнаружил файл JavaScript, в котором не указан тип содержимого, он сможет угадать тип содержимого и затем выполнить его.

Проблема с сниффингом контента заключается в том, что это позволяет злоумышленникам использовать полиглоты (то есть файл, который допустим как несколько типов контента) для выполнения XSS-атак. Например, некоторые сайты могут разрешать пользователям отправлять действительный документ PostScript на веб-сайт и просматривать его. Злоумышленник может создать документ PostScript, который также является допустимым файлом JavaScript, и выполнить с его помощью XSS-атаку.

Опять же, из документов, чтобы переопределить значение по умолчанию -

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends
   WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
      // ...
      .headers()
        .contentTypeOptions();
  }
}
person Ron    schedule 04.02.2015
comment
Отлично, спасибо за отзыв и добавленную информацию. Я надеюсь, что это поможет и другим. - person Ron; 04.02.2015

Вау, я подумал, что это что-то в этом роде. Спасибо большое

Когда я попробовал это, и это начало работать

.headers()
    .disable()

Я сузил значение contentTypeOptions по умолчанию до ..

.headers()
        //.contentTypeOptions()   // If this is uncommented it fails.
        .xssProtection()
        .cacheControl()
        .httpStrictTransportSecurity()
        .frameOptions()
        .and()
person redboy    schedule 04.02.2015