Как скрыть конечные точки Spring Security OAuth2 от пользовательского интерфейса Swagger?

У меня есть приложение API, созданное с помощью Spring Boot. Я использовал подключаемый модуль swagger-springmvc версии 0.9.5 вместе с пользовательским интерфейсом Swagger для создания интерактивной документации и интерфейса взаимодействия с методами API.

Недавно я представил приложение Spring Security и OAuth. Это представило еще несколько разделов, появляющихся в пользовательском интерфейсе Swagger для:

  • конечная точка авторизации, которая имеет набор операций HTTP, доступных по пути /oauth/authorize
  • check-token-endpoint, который имеет множество операций HTTP, доступных по пути /oauth/check_token
  • конечная точка whitelabel-approval-endpoint, которая имеет множество HTTP-операций, доступных по пути /oauth/confirm_access.
  • whitelabel-error-endpoint с набором HTTP-операций, доступных по пути /oauth/error

Я могу понять, для чего они нужны, но я не хочу, чтобы они появлялись в моем интерфейсе пользовательского интерфейса Swagger. Как мне их скрыть?

Конфигурация com.mangofactory.swagger.plugin.SwaggerSpringMvcPlugin предлагает метод includePatterns(), но не позволяет исключить шаблоны. С includePatterns() каждый раз, когда кто-то добавляет метод в API, нужно будет не забыть добавить его туда, что не идеально. У меня нет общего префикса для всех методов API, с которыми я могу использовать includePatterns().


person Naymesh Mistry    schedule 10.06.2015    source источник
comment
Я знаю, что этому уже год, но почему бы просто не добавить ко всем методам префикс /api/, а затем вы можете использовать .includePatterns("/api/.*")   -  person Shark    schedule 01.02.2016
comment
Как я уже сказал в самом вопросе: у меня нет общего префикса для всех методов API, с которыми я могу использовать includePatterns().   -  person Naymesh Mistry    schedule 03.02.2016
comment
Да, я просто предложил в качестве обходного пути заставить все методы иметь общий префикс и использовать какой-то общий префикс (например, /api/ для всех). Но я могу понять, если это невозможно, если API уже используется.   -  person Shark    schedule 03.02.2016


Ответы (2)


Все, что вам нужно, это принять все пути, кроме /oauth.*

.select()
.paths(input ->
    !PathSelectors.regex("/oauth.*").apply(input) &&
    PathSelectors.any().apply(input))
.build()
person André Abreu    schedule 22.03.2018

Я была такая же проблема. Я решил это, изменив параметры создания Docket. я использовал

@Bean
public Docket oAuthService() {
    return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.any())
            .paths(PathSelectors.any())
            .build()
            .pathMapping("/")
            .directModelSubstitute(LocalDate.class,
                    String.class)
            .genericModelSubstitutes(ResponseEntity.class)
            .alternateTypeRules(
                    newRule(typeResolver.resolve(DeferredResult.class,
                            typeResolver.resolve(ResponseEntity.class, WildcardType.class)),
                            typeResolver.resolve(WildcardType.class)))
            .useDefaultResponseMessages(false)
            .globalResponseMessage(RequestMethod.GET,
                    newArrayList(new ResponseMessageBuilder()
                            .code(500)
                            .message("500 message")
                            .responseModel(new ModelRef("Error"))
                            .build()))
            .securitySchemes(newArrayList(apiKey()))
            .securityContexts(newArrayList(securityContext()))
            .enableUrlTemplating(true)
            .tags(new Tag("Oauth Service", "Oauth Service"));
}

В результате все конечные точки spring-oauth стали частью моей спецификации чванства. Я изменил зарегистрированный API, чтобы использовать мой basePackage вместо any(). Что-то вроде этого:

.apis(RequestHandlerSelectors.basePackage("my.base.package.name"))
person Harry    schedule 26.06.2017