TB-50: Improve swagger configuration (#5)

This commit is contained in:
Igor Kulikov 2016-12-05 19:14:25 +02:00 committed by GitHub
parent e1dd86041f
commit b154f1a4fd
3 changed files with 34 additions and 26 deletions

View File

@ -15,11 +15,15 @@
*/
package org.thingsboard.server.config;
import com.fasterxml.classmate.ResolvedType;
import com.fasterxml.classmate.TypeResolver;
import com.fasterxml.jackson.databind.JsonNode;
import com.google.common.base.Predicate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.thingsboard.server.common.data.security.Authority;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.schema.AlternateTypeRule;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
@ -27,18 +31,33 @@ import springfox.documentation.spring.web.plugins.Docket;
import java.util.List;
import static com.google.common.base.Predicates.and;
import static com.google.common.base.Predicates.not;
import static com.google.common.collect.Lists.newArrayList;
import static springfox.documentation.builders.PathSelectors.regex;
@Configuration
public class SwaggerConfiguration {
@Bean
public Docket thingsboardApi() {
TypeResolver typeResolver = new TypeResolver();
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(
jsonNodeType,
stringType))
.select()
.paths(PathSelectors.any())
.paths(apiPaths())
.build()
.securitySchemes(newArrayList(jwtTokenKey()))
.securityContexts(newArrayList(securityContext()));
@ -51,10 +70,21 @@ public class SwaggerConfiguration {
private SecurityContext securityContext() {
return SecurityContext.builder()
.securityReferences(defaultAuth())
.forPaths(PathSelectors.regex("/api.*"))
.forPaths(securityPaths())
.build();
}
private Predicate<String> apiPaths() {
return regex("/api.*");
}
private Predicate<String> securityPaths() {
return and(
regex("/api.*"),
not(regex("/api/noauth.*"))
);
}
List<SecurityReference> defaultAuth() {
AuthorizationScope[] authorizationScopes = new AuthorizationScope[3];
authorizationScopes[0] = new AuthorizationScope(Authority.SYS_ADMIN.name(), "System administrator");
@ -67,7 +97,7 @@ public class SwaggerConfiguration {
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Thingsboard REST API")
.description("For instructions how to authorize requests please visit <a href='http://thingsboard.io/docs/rest-auth'>Documentation page</a>")
.description("For instructions how to authorize requests please visit <a href='http://thingsboard.io/docs/reference/rest-api/'>REST API documentation page</a>.")
.contact(new Contact("Thingsboard team", "http://thingsboard.io", "info@thingsboard.io"))
.license("Apache License Version 2.0")
.licenseUrl("https://github.com/thingsboard/thingsboard/blob/master/LICENSE")

View File

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.controller;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
@ -46,18 +45,6 @@ public class AdminController extends BaseController {
}
@PreAuthorize("hasAuthority('SYS_ADMIN')")
@ApiOperation(
value = "Save admin settings", notes = "Saves admin settings",
response = AdminSettings.class,
authorizations = {
@Authorization(value = "X-Authorization", scopes = {
@AuthorizationScope(scope = "SYS_ADMIN", description = "")
})})
@ApiResponses(value = {
@ApiResponse(code = 200, response = AdminSettings.class, message = "Admin settings successfully updated"),
@ApiResponse(code = 400, message = "Invalid admin settings payload supplied"),
@ApiResponse(code = 404, message = "Admin settings not found")}
)
@RequestMapping(value = "/settings", method = RequestMethod.POST)
@ResponseBody
public AdminSettings saveAdminSettings(@RequestBody AdminSettings adminSettings) throws ThingsboardException {

View File

@ -15,9 +15,6 @@
*/
package org.thingsboard.server.controller;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
@ -37,12 +34,6 @@ import java.util.List;
@RequestMapping("/api")
public class RuleController extends BaseController {
@ApiOperation(value = "getRuleById", nickname = "Get Rule By ID")
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Success", response = RuleMetaData.class),
@ApiResponse(code = 401, message = "Unauthorized"),
@ApiResponse(code = 403, message = "Forbidden"),
@ApiResponse(code = 404, message = "Not Found")})
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
@RequestMapping(value = "/rule/{ruleId}", method = RequestMethod.GET)
@ResponseBody