Включение 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()