2017-12-04 4 views
0

내 엔드 포인트 인증의 모든 OAuth2를하는 것입니다 때문에이 프로젝트를 springboot하는 swagger2을 통합, 그래서 다음 코드처럼, 모든 방법으로 인증 헤더를 추가해야합니다Swagger2 너무 많은 같은 주석

@ApiImplicitParams({  
    @ApiImplicitParam(paramType="header",name="Authorization",dataType="String",required=true, value="Bearer {access-token}") 
}) 

이를 동일한 주석이 너무 많습니다. 리팩토링 할 수있는 방법이 있습니까?

Swagger2 꼬리표 코드 :

@Bean 
public Docket createRestApi() { 
    return new Docket(DocumentationType.SWAGGER_2) 
      .apiInfo(apiInfo()) 
      .ignoredParameterTypes(TokenInfo.class, HttpServletRequest.class, HttpServletResponse.class) 
      .select() 
      .apis(RequestHandlerSelectors.basePackage("com.xxx.yyy.resource")) 
      .paths(PathSelectors.any()) 
      .build(); 
} 
+0

그래서'swagger-ui'에서'access_token'을 통해 API를 테스트하고 싶습니까? –

+0

예, swagger-ui 페이지에서 모든 엔드 포인트를 테스트하려면 access_token이 필요합니다. 실제로, 내 테스트 만한다면, 나는 그것을 추가 할 필요는 없지만, 테스트 팀은 그것을 원한다. –

+0

그래서 docket 구성 코드를 제공 할 수 있습니까? –

답변

2

내가 해결책을 찾기 위해 며칠을 보낸다. 여기에 access_token의 docket 구성을 제공합니다. 전역 매개 변수를 구성하면 모든 끝점을 포함하는 공통 매개 변수 (access_token)를 말할 수 있습니다. 따라서 모든 끝점에 @ApiImplicitParams을 포함 할 필요가 없습니다. 아래 주어진 가능성있는 일괄 구성 (나중에 API 정보에 대해 자신의 것으로 변경할 수 있음).

@Bean 
public Docket api() { 
    return new Docket(DocumentationType.SWAGGER_2) 
      .select() 
      .apis(RequestHandlerSelectors.basePackage("com.xxx.yyy.resource")) 
      .paths(PathSelectors.any()) 
      .build() 
      .globalOperationParameters(commonParameters()) 
      .apiInfo(apiInfo()) 
      .ignoredParameterTypes(TokenInfo.class, HttpServletRequest.class, HttpServletResponse.class) 
      .securityContexts(Lists.newArrayList(securityContext())) 
      .securitySchemes(Lists.newArrayList(apiKey())); 
} 


private List<Parameter> commonParameters() { 
    List<Parameter> parameters = new ArrayList<Parameter>(); 
    parameters.add(new ParameterBuilder() 
      .name("access_token") 
      .description("token for authorization") 
      .modelRef(new ModelRef("string")) 
      .parameterType("query") 
      .required(true) 
      .build()); 

    return parameters; 
} 

private ApiInfo apiInfo() { 
    ApiInfo apiInfo = new ApiInfo(
      "My REST API", 
      "Some custom description of API.", 
      "API TOS", 
      "Terms of service", 
      "[email protected]", 
      "License of API", 
      "API license URL"); 
    return apiInfo; 
} 

private SecurityContext securityContext() { 
    return SecurityContext.builder() 
      .securityReferences(defaultAuth()) 
      .forPaths(PathSelectors.any()) 
      .build(); 
} 

List<SecurityReference> defaultAuth() { 
    AuthorizationScope authorizationScope 
      = new AuthorizationScope("global", "accessEverything"); 
    AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; 
    authorizationScopes[0] = authorizationScope; 
    return Lists.newArrayList(
      new SecurityReference("AUTHORIZATION", authorizationScopes)); 
} 

private ApiKey apiKey() { 
    return new ApiKey("AUTHORIZATION", "access_token", "header"); 
} 

그냥 코드를 붙여 swagger-ui에서 시도하고 나에게 상태를 알려 주시기 바랍니다.

+0

잘 작동합니다. 감사합니다. –

+0

당신은 stackoverflow의 동료 사용자들에 대해서도 대답을 받아 들여야합니다. @Liuguanghua –

+1

하는 방법? 수락 버튼을 찾을 수 없습니다. –