igorferreira
11/11/2019 - 4:27 AM

SwaggerConfig for springfox on springboot2

SwaggerConfig for springfox on springboot2

package br.com.example.config

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.servlet.ServletContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import com.google.common.collect.Lists;

import lombok.extern.slf4j.Slf4j;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.OAuthBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.ClientCredentialsGrant;
import springfox.documentation.service.GrantType;
import springfox.documentation.service.OAuth;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger.web.ApiKeyVehicle;
import springfox.documentation.swagger.web.SecurityConfiguration;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Slf4j
@Configuration
@EnableSwagger2
public class SwaggerConfig extends WebMvcConfigurationSupport {

	@Value("${api.title}")
	public String apiTitle;

	@Value("${api.description}")
	public String apiDescription;

	@Value("${api.version}")
	public String apiVersion;

	@Value("${api.host}")
	public String apiHost;
	
	@Value("${api.protocol}")
	public String protocol;

	@Value("${security.oauth2.client.scope}")
	public String securityScope;

	@Value("${security.oauth2.client.client-id}")
	public String clientId;

	@Value("${security.oauth2.client.client-secret}")
	public String clientSecret;

	@Autowired
	ServletContext servletContext;

	public static final String SECURITY_SCHEMA_OAUTH2_CLIENT_CREDENTIALS = "oauth2_client_credentials";
	public static final String AUTHORIZATION_SCOPE_GLOBAL_DESC = "accessEverything";
	public static final String API_KEY = "Authorization";
	public static final String API_KEY_NAME = "Authorization Bearer Token";
	public static final String SCOPE_SEPARATOR = "Bearer";
	
	@Bean
	public Docket productApi() {

		return new Docket(DocumentationType.SWAGGER_2)

				.useDefaultResponseMessages(false)

				.select()

				.apis(RequestHandlerSelectors.basePackage("br.com.sulamerica.susre.auto.molicar.controller"))
				.paths(PathSelectors.ant("/restws/v1/auto/molicar/modelos/**"))

				.build()

				.securitySchemes(Collections.singletonList(securitySchemes()))
				.securityContexts(Collections.singletonList(securityContext()))

				.pathMapping("/")

				.apiInfo(apiInfo())

				.host(apiHost);
	}

	/* 
	 * SecurityConfiguration
	     @param clientId - client id
		 @param clientSecret - client secret
		 @param realm - realm
		 @param appName - application name
		 @param apiKey - api key
		 @param apiKeyVehicle - how the api key is transmitted
		 @param apiKeyName - name of the api key
		 @param scopeSeparator - scope separator
	 */
	@SuppressWarnings("deprecation")
	@Bean
	public SecurityConfiguration swaggerSecurityConfiguration() { // @formatter:off
		return new SecurityConfiguration(
				"",
				"",
				null,
				SECURITY_SCHEMA_OAUTH2_CLIENT_CREDENTIALS,
				API_KEY,
				ApiKeyVehicle.HEADER,
				API_KEY_NAME,
				SCOPE_SEPARATOR);
	}

	private ApiInfo apiInfo() {	// @formatter:off
		return new ApiInfoBuilder()
				.title(apiTitle)
				.deion(apiDeion)
				.version(apiVersion).build();
	}  // @formatter:on

	public OAuth securitySchemes() { // @formatter:off
		return new OAuthBuilder()
				.name(SECURITY_SCHEMA_OAUTH2_CLIENT_CREDENTIALS)
				.grantTypes(grantTypes())
				.scopes(Lists.newArrayList(scopes()))
				.build();
	}  // @formatter:on

	private SecurityContext securityContext() {	// @formatter:off
		return SecurityContext
				.builder()
				.securityReferences(securityRequirements())
				.forPaths(PathSelectors.ant("/restws/v1/auto/molicar/modelos/**"))
				.build();
	} // @formatter:on

	private List<GrantType> grantTypes() {	// @formatter:off
		List<GrantType> grantTypes = new ArrayList<GrantType>();
		
		String authUrl = protocol + apiHost+"/oauth/token";
		String authUrlWithoutProtocol = apiHost+"/oauth/token";
		
		log.info("\n\n authUrl = {}\n authUrlWithoutProtocol = {} \n\n",authUrl,authUrlWithoutProtocol);

		ClientCredentialsGrant clientCredentialsGrant = new ClientCredentialsGrant(authUrl);
		grantTypes.add(clientCredentialsGrant);

		return grantTypes;
	}	// @formatter:on
	
	private List<SecurityReference> securityRequirements() {	// @formatter:off
		final AuthorizationScope[] authorizationScopes = scopes();
		return Lists.newArrayList(new SecurityReference(SECURITY_SCHEMA_OAUTH2_CLIENT_CREDENTIALS, authorizationScopes));
	}	// @formatter:on

	private AuthorizationScope[] scopes() {
		final AuthorizationScope authorizationScope = new AuthorizationScope(securityScope,AUTHORIZATION_SCOPE_GLOBAL_DESC);
		final AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
		authorizationScopes[0] = authorizationScope;
		return authorizationScopes;
	}

	@Override
	protected void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");

		registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");

		registry.addResourceHandler("/favicon.ico").addResourceLocations("classpath:/META-INF/resources/");
	}

}