Включение Spring Security делает текст Swagger выводимым / простым вместо HTML

Swagger работает! Я могу взаимодействовать с 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, который ранее работал, я вместо этого получаю тип ответа "text/plain", и вместо симпатичного HTML-браузера, я вижу исходный код.

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

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

2 ответа

Решение

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

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

Исторически браузеры, в том числе 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();
  }
}

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

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

.headers()
    .disable()

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

.headers()
        //.contentTypeOptions()   // If this is uncommented it fails.
        .xssProtection()
        .cacheControl()
        .httpStrictTransportSecurity()
        .frameOptions()
        .and()
Другие вопросы по тегам