Я пытаюсь включить несколько схем безопасности, которые будут использоваться компонентом аутентификации 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;
}