swagger-ui не получает информацию об API для Spring MVC API

Я использую Spring MVC и Spring Security, и я хотел принести документацию Swagger. Я следил за руководством hier и получил полный json документ под URL ... / v2 / api-docs.

Но когда я также включил swagger-ui, у меня появилась страница с ошибкой под url ... / swagger-ui.html, как на скриншоте: все не определено, он не видит мой api. введите здесь описание изображения

Я знаю, что иногда Swagger-Ui может сталкиваться с настройками Spring, и запросы не фильтруются с помощью безопасности. Может в этом проблема? Что я мог выключить, чтобы он заработал?

Или это может быть проблема классов, отмеченных @ControllerAdvice. Я использую его для ExceptionResolver:

@ControllerAdvice
public class ExceptionResolver extends AbstractHandlerExceptionResolver{...}

Вот мой фрагмент Maven:

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.6.0</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.6.0</version>
        </dependency>

ОБНОВИТЬ мою конфигурацию безопасности

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{

private UserDetailsService userDetailsService;  
private PreAuthenticatedAuthenticationProvider preAuthenticatedProvider;

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {

    Map<String, List<GrantedAuthority>> rolesAuthorities = userDao.getRolesWithAutorities();

    userDetailsService = new CustomUserDetailsService();
    UserDetailsByNameServiceWrapper<PreAuthenticatedAuthenticationToken> wrapper = 
            new UserDetailsByNameServiceWrapper<PreAuthenticatedAuthenticationToken>(userDetailsService);
    preAuthenticatedProvider = new PreAuthenticatedAuthenticationProvider();
    preAuthenticatedProvider.setPreAuthenticatedUserDetailsService(wrapper);
    auth.authenticationProvider(preAuthenticatedProvider);
    preAuthenticatedProvider.setThrowExceptionWhenTokenRejected(true);
}

@Override //(does not help)
  public void configure(WebSecurity web) throws Exception {     
    web.ignoring().antMatchers("/**/v2/api-docs/**", 
            "/**/configuration/ui/**", "/**/swagger-resources/**", "/**/configuration/security/**", "/**/swagger-ui.html");

 }

@Bean
public SmUserFailureHandler smUserFailureHandler(){
    return new SmUserFailureHandler();
}   

@Bean
public AccessDeniedHandler accessDeniedHandler(){
    AccessDeniedHandlerImpl handler = new AccessDeniedHandlerImpl();
    handler.setErrorPage("/errorpage/");        
    return handler;     
}

public RequestHeaderAuthenticationFilter siteMinderFilter() throws Exception
{

    RequestHeaderAuthenticationFilter siteMinderFilter = new DelegateRequestMatchingFilter(
            new OrRequestMatcher(new AntPathRequestMatcher("...**"),
            new AntPathRequestMatcher("..."),
            smUserFailureHandler());

    siteMinderFilter.setPrincipalRequestHeader("SM_USER");
    siteMinderFilter.setAuthenticationManager(authenticationManager());   
    siteMinderFilter.setContinueFilterChainOnUnsuccessfulAuthentication(false);
    siteMinderFilter.setExceptionIfHeaderMissing(false);
    return siteMinderFilter;
}

@Override
protected void configure(HttpSecurity http) throws Exception {  

  ...

http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER);

 RequestHeaderAuthenticationFilter smFilter = siteMinderFilter();
 http.addFilter(smFilter);
 ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry = http.authorizeRequests();     
  http = registry.and();
http.formLogin().loginPage("/resource/User/Login/").failureHandler(smUserFailureHandler());
  http.formLogin().failureUrl("/resource/User/Login/").failureHandler(smUserFailureHandler());

  http.csrf().disable();
  http.headers().cacheControl().disable();

}
}

person user2957954    schedule 10.05.2017    source источник
comment
это может помочь - github.com/arpitaggarwal/swagger-example   -  person Arpit Aggarwal    schedule 10.05.2017
comment
см .: stackoverflow .com / questions / 43061496 /   -  person Vaibs    schedule 11.05.2017
comment
Почему у вас есть такие antMatchers / ** / v2 / api-docs / **? SpringFox не добавляет никаких префиксов к конечным точкам swagger. Попробуйте просмотреть журналы Spring для всех конечных точек, проверьте имена конечных точек Swagger и сопоставьте их с этим.   -  person Henrique Martins    schedule 11.05.2017
comment
@HenriqueMartins, что ты имеешь ввиду? Пробовал по-разному сопоставить, совсем не получается. Моя другая функция конечной точки swagger хорошо: я получаю обычные jsons   -  person user2957954    schedule 11.05.2017


Ответы (1)


Вероятно, вам нужно включить доступ к конечным точкам swagger в конфигурации безопасности Spring.

Это конечные точки, созданные springfox:

2017-05-10 15:07:15.141  INFO 22472 --- [  restartedMain] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/v2/api-docs],methods=[GET],produces=[application/json || application/hal+json]}" onto public org.springframework.http.ResponseEntity<springfox.documentation.spring.web.json.Json> springfox.documentation.swagger2.web.Swagger2Controller.getDocumentation(java.lang.String,javax.servlet.http.HttpServletRequest)
2017-05-10 15:07:15.146  INFO 22472 --- [  restartedMain] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/swagger-resources/configuration/ui]}" onto org.springframework.http.ResponseEntity<springfox.documentation.swagger.web.UiConfiguration> springfox.documentation.swagger.web.ApiResourceController.uiConfiguration()
2017-05-10 15:07:15.147  INFO 22472 --- [  restartedMain] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/swagger-resources/configuration/security]}" onto org.springframework.http.ResponseEntity<springfox.documentation.swagger.web.SecurityConfiguration> springfox.documentation.swagger.web.ApiResourceController.securityConfiguration()
2017-05-10 15:07:15.148  INFO 22472 --- [  restartedMain] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/swagger-resources]}" onto org.springframework.http.ResponseEntity<java.util.List<springfox.documentation.swagger.web.SwaggerResource>> springfox.documentation.swagger.web.ApiResourceController.swaggerResources()

Добавьте этот метод в свой класс конфигурации безопасности Spring:

@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources", "/configuration/security", "/swagger-ui.html");
    }

}
person Henrique Martins    schedule 10.05.2017
comment
это не работает. Он даже не фильтрует эти URI - person user2957954; 10.05.2017
comment
Можете ли вы разместить здесь свой класс конфигурации безопасности Spring? Возможно, там что-то есть. Кроме того, можете ли вы попытаться скрутить конечные точки swagger? Если он дает 403 свою безопасность. - person Henrique Martins; 10.05.2017
comment
Я добавил конфигурацию безопасности - person user2957954; 10.05.2017