Как предоставить SecurityConfiguration для каждой SecurityScheme в SwaggerUI - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь включить несколько схем безопасности, которые будут использоваться компонентом аутентификации Swagger UI.У каждой схемы безопасности должен быть свой идентификатор клиента / секрет клиента.Я не могу найти способ предоставить несколько разных идентификаторов клиента / секрета клиента, потому что для всех этих полей загружается одна конфигурация SecurityConfiguration.

Я знаю, что из соображений безопасности нецелесообразно включать клиента-id / клиент-секрет.Эти значения будут доступны только в наших средах разработки и контроля качества и только внутри нашей сети.

@Autowired(required = false)
private ClientCredentialsResourceDetails clientCredentials;

@Bean
public SecurityConfiguration security() {
    // Here we are loading the client-id/client-secret into the UI
    // Apparently, this can only be configured for a single client-id/client-secret
    SecurityConfigurationBuilder config = SecurityConfigurationBuilder.builder()
        .clientId(clientCredentials.getClientId())
        .clientSecret(clientCredentials.getClientSecret())
        .scopeSeparator(" ")
        .useBasicAuthenticationWithAccessCodeGrant(true);
    return config.build();
}

@Bean
public Docket docket() {
    ApiSelectorBuilder apiBuilder = new Docket(DocumentationType.SWAGGER_2).select()
        .apis(RequestHandlerSelectors.any());

    for (String endpoint : swaggerProperties.getDocumentedEndpoints()) {
        apiBuilder.paths(PathSelectors.regex(endpoint));
    }
    return apiBuilder.build()
        .apiInfo(apiInfo())
       // Setup different security schemes .securitySchemes(Arrays.asList(clientCredentialsSecurityScheme(), passwordSecurityScheme()))
        .securityContexts(Arrays.asList(securityContext()));
}

private ApiInfo apiInfo() {
    return new ApiInfo(swaggerProperties.getApiLongName(),
        swaggerProperties.getApiDescription(),
        swaggerProperties.getApiVersion(),
        swaggerProperties.getTermsOfServiceUrl(),
        new Contact("", "", swaggerProperties.getDeveloperEmail()),
        swaggerProperties.getLicense(), swaggerProperties.getLicenseUrl(), Arrays.asList());
}

private String getAccessTokenUri() {
    String accessTokenUri = null;
    if(clientCredentials != null) {
        accessTokenUri = clientCredentials.getAccessTokenUri();
    }
    return accessTokenUri;
}

private SecurityScheme clientCredentialsSecurityScheme() {
    ClientCredentialsGrant grantType2 = new ClientCredentialsGrant(getAccessTokenUri());

    SecurityScheme oauth = new OAuthBuilder().name("client_credential_scheme")
        .grantTypes(Arrays.asList(grantType2))
        .scopes(Arrays.asList(scopes()))
        .build();
    return oauth;
}

private SecurityScheme passwordSecurityScheme() {
    GrantType grantType = new ResourceOwnerPasswordCredentialsGrant(getAccessTokenUri());

    SecurityScheme oauth = new OAuthBuilder().name("password_scheme")
        .grantTypes(Arrays.asList(grantType))
        .build();
    return oauth;
}

private SecurityContext securityContext() {
    return SecurityContext.builder()
        .securityReferences(
                    Arrays.asList(new SecurityReference("client_credential_scheme", scopes()),
                            new SecurityReference("password_scheme", scopes())))
        .forPaths(PathSelectors.regex("/v.*"))
        .build();
}

private AuthorizationScope[] scopes() {
    AuthorizationScope[] scopes = {};
    return scopes;
}
...