Конфигурация неглобального параметра Swagger2 (Token) без повторного ввода

Spring Boot Java Swagger

В Интернете есть много руководств по Swagger2, а также много статей о добавлении глобальных параметров головы (таких как токен) в Swagger. Например:

Swagger2 добавляет параметры заголовка HTTP

Swagger2 Добавить HTTP-параметр HTTP, решить информацию о токене пользователя сохраняется

Но у вышеописанной схемы есть два недостатка:

  1. Необходимо вводить параметры отдельно под каждый интерфейс
  2. Параметры настраиваются глобально, если какие-то интерфейсы (такие как логин и т.п.) не требуют параметров, то их нужно объявлять в интерфейсе через аннотацию, что более хлопотно.

Таким образом, схема оптимизации выбирается следующим образом:

1. Настройте глобальные параметры с помощью Swagger2 securitySchemes: как показано в следующем коде, параметр с именем «Авторизация» и типом «заголовок» добавляется в ApiKey securitySchemes.

private List<ApiKey> securitySchemes() {
        return newArrayList(
                new ApiKey("Authorization", "Authorization", "header"));
 }

2. Используйте регулярные выражения в securityContexts Swagger2, чтобы задать интерфейс, который должен использовать параметры (или удалить интерфейс, которому не нужно использовать параметры), как показано в следующем коде, через PathSelectors.regex("^( ?!auth ).*$"), все интерфейсы, содержащие "auth", не должны использовать securitySchemes. То есть вам не нужно использовать параметр с именем «Авторизация», установленный выше, и тип «заголовок».

private List<SecurityContext> securityContexts() {
        return newArrayList(
                SecurityContext.builder()
                        .securityReferences(defaultAuth())
                        .forPaths(PathSelectors.regex("^(?!auth).*$"))
                        .build()
        );
    }

После завершения настройки входим в SwaggerUI, в правом верхнем углу появляется кнопка «Авторизация», нажимаем для ввода настроенных нами параметров.
Для интерфейса (интерфейс, включающий авторизацию, описанную выше) не требуется вводить параметры, ввод не является параметром авторизации, доступ к которому возможен.
Другие интерфейсы вернут ошибку 401. Нажмите кнопку «Авторизация» в правом верхнем углу и введите настроенные параметры для доступа. После того, как параметр введен, он действует глобально, и нет необходимости вводить его отдельно для каждого интерфейса.
image.png
На данный момент настройка неглобального параметра Head Swagger2 без повторного ввода завершена.
Соответствующий полный код Swagger2 выглядит следующим образом (проект основан на Springboot):

@Configuration
@EnableSwagger2
public class Swagger {
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2).
                useDefaultResponseMessages(false)
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.regex("^(?!auth).*$"))
                .build()
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts())
                ;
    }
    private List<ApiKey> securitySchemes() {
        return newArrayList(
                new ApiKey("Authorization", "Authorization", "header"));
    }
    private List<SecurityContext> securityContexts() {
        return newArrayList(
                SecurityContext.builder()
                        .securityReferences(defaultAuth())
                        .forPaths(PathSelectors.regex("^(?!auth).*$"))
                        .build()
        );
    }
    List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        return newArrayList(
                new SecurityReference("Authorization", authorizationScopes));
    }
}