@ -19,6 +19,7 @@ import com.fasterxml.classmate.ResolvedType;
import com.fasterxml.classmate.TypeResolver ;
import com.fasterxml.classmate.TypeResolver ;
import com.fasterxml.jackson.databind.JsonNode ;
import com.fasterxml.jackson.databind.JsonNode ;
import com.google.common.base.Predicate ;
import com.google.common.base.Predicate ;
import org.springframework.beans.factory.annotation.Value ;
import org.springframework.context.annotation.Bean ;
import org.springframework.context.annotation.Bean ;
import org.springframework.context.annotation.Configuration ;
import org.springframework.context.annotation.Configuration ;
import org.thingsboard.server.common.data.security.Authority ;
import org.thingsboard.server.common.data.security.Authority ;
@ -43,71 +44,94 @@ import static springfox.documentation.builders.PathSelectors.regex;
@Configuration
@Configuration
public class SwaggerConfiguration {
public class SwaggerConfiguration {
@Bean
@Value ( "${swagger.api_path_regex}" )
public Docket thingsboardApi ( ) {
private String apiPathRegex ;
TypeResolver typeResolver = new TypeResolver ( ) ;
@Value ( "${swagger.security_path_regex}" )
final ResolvedType jsonNodeType =
private String securityPathRegex ;
typeResolver . resolve (
@Value ( "${swagger.non_security_path_regex}" )
JsonNode . class ) ;
private String nonSecurityPathRegex ;
final ResolvedType stringType =
@Value ( "${swagger.title}" )
typeResolver . resolve (
private String title ;
String . class ) ;
@Value ( "${swagger.description}" )
private String description ;
@Value ( "${swagger.contact.name}" )
private String contactName ;
@Value ( "${swagger.contact.url}" )
private String contactUrl ;
@Value ( "${swagger.contact.email}" )
private String contactEmail ;
@Value ( "${swagger.license.title}" )
private String licenseTitle ;
@Value ( "${swagger.license.url}" )
private String licenseUrl ;
@Value ( "${swagger.version}" )
private String version ;
return new Docket ( DocumentationType . SWAGGER_2 )
@Bean
. groupName ( "thingsboard" )
public Docket thingsboardApi ( ) {
. apiInfo ( apiInfo ( ) )
TypeResolver typeResolver = new TypeResolver ( ) ;
. alternateTypeRules (
final ResolvedType jsonNodeType =
typeResolver . resolve (
JsonNode . class ) ;
final ResolvedType stringType =
typeResolver . resolve (
String . class ) ;
return new Docket ( DocumentationType . SWAGGER_2 )
. groupName ( "thingsboard" )
. apiInfo ( apiInfo ( ) )
. alternateTypeRules (
new AlternateTypeRule (
new AlternateTypeRule (
jsonNodeType ,
jsonNodeType ,
stringType ) )
stringType ) )
. select ( )
. select ( )
. paths ( apiPaths ( ) )
. paths ( apiPaths ( ) )
. build ( )
. build ( )
. securitySchemes ( newArrayList ( jwtTokenKey ( ) ) )
. securitySchemes ( newArrayList ( jwtTokenKey ( ) ) )
. securityContexts ( newArrayList ( securityContext ( ) ) )
. securityContexts ( newArrayList ( securityContext ( ) ) )
. enableUrlTemplating ( true ) ;
. enableUrlTemplating ( true ) ;
}
}
private ApiKey jwtTokenKey ( ) {
private ApiKey jwtTokenKey ( ) {
return new ApiKey ( "X-Authorization" , "JWT token" , "header" ) ;
return new ApiKey ( "X-Authorization" , "JWT token" , "header" ) ;
}
}
private SecurityContext securityContext ( ) {
private SecurityContext securityContext ( ) {
return SecurityContext . builder ( )
return SecurityContext . builder ( )
. securityReferences ( defaultAuth ( ) )
. securityReferences ( defaultAuth ( ) )
. forPaths ( securityPaths ( ) )
. forPaths ( securityPaths ( ) )
. build ( ) ;
. build ( ) ;
}
}
private Predicate < String > apiPaths ( ) {
private Predicate < String > apiPaths ( ) {
return regex ( "/api.*" ) ;
return regex ( apiPathRegex ) ;
}
}
private Predicate < String > securityPaths ( ) {
private Predicate < String > securityPaths ( ) {
return and (
return and (
regex ( "/api.*" ) ,
regex ( securityPathRegex ) ,
not ( regex ( "/api/noauth.*" ) )
not ( regex ( nonSecurityPathRegex ) )
) ;
) ;
}
}
List < SecurityReference > defaultAuth ( ) {
List < SecurityReference > defaultAuth ( ) {
AuthorizationScope [ ] authorizationScopes = new AuthorizationScope [ 3 ] ;
AuthorizationScope [ ] authorizationScopes = new AuthorizationScope [ 3 ] ;
authorizationScopes [ 0 ] = new AuthorizationScope ( Authority . SYS_ADMIN . name ( ) , "System administrator" ) ;
authorizationScopes [ 0 ] = new AuthorizationScope ( Authority . SYS_ADMIN . name ( ) , "System administrator" ) ;
authorizationScopes [ 1 ] = new AuthorizationScope ( Authority . TENANT_ADMIN . name ( ) , "Tenant administrator" ) ;
authorizationScopes [ 1 ] = new AuthorizationScope ( Authority . TENANT_ADMIN . name ( ) , "Tenant administrator" ) ;
authorizationScopes [ 2 ] = new AuthorizationScope ( Authority . CUSTOMER_USER . name ( ) , "Customer" ) ;
authorizationScopes [ 2 ] = new AuthorizationScope ( Authority . CUSTOMER_USER . name ( ) , "Customer" ) ;
return newArrayList (
return newArrayList (
new SecurityReference ( "X-Authorization" , authorizationScopes ) ) ;
new SecurityReference ( "X-Authorization" , authorizationScopes ) ) ;
}
}
private ApiInfo apiInfo ( ) {
private ApiInfo apiInfo ( ) {
return new ApiInfoBuilder ( )
return new ApiInfoBuilder ( )
. title ( "Thingsboard REST API" )
. title ( title )
. description ( "For instructions how to authorize requests please visit <a href='http://thingsboard.io/docs/reference/rest-api/'>REST API documentation page</a>." )
. description ( description )
. contact ( new Contact ( "Thingsboard team" , "http://thingsboard.io" , "info@thingsboard.io" ) )
. contact ( new Contact ( contactName , contactUrl , contactEmail ) )
. license ( "Apache License Version 2.0" )
. license ( licenseTitle )
. licenseUrl ( "https://github.com/thingsboard/thingsboard/blob/master/LICENSE" )
. licenseUrl ( licenseUrl )
. version ( "2.0" )
. version ( version )
. build ( ) ;
. build ( ) ;
}
}
}
}