sourcetip

Springdoc-openapi-ui의 Bearer Token Authentication(JWT)용 인증 사용 단추

fileupload 2023. 8. 26. 12:09
반응형

Springdoc-openapi-ui의 Bearer Token Authentication(JWT)용 인증 사용 단추

springdoc-openapi-ui에서 "Authorize" 버튼을 활성화하는 방법 (OpenAPI 3.0)/swagger-ui.html예를 들어 JWT와 같은 베어러 토큰 인증에 사용됩니다.

스프링에 추가해야 하는 주석@Controller그리고.@Configuration수업?

Authorize button

Authorize form for Bearer Token Authentication

주석 대신 빈 초기화를 사용하는 것을 선호합니다.

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info; 
import io.swagger.v3.oas.models.security.SecurityRequirement; 
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;

@Configuration
public class OpenApi30Config {

  private final String moduleName;
  private final String apiVersion;

  public OpenApi30Config(
      @Value("${module-name}") String moduleName,
      @Value("${api-version}") String apiVersion) {
    this.moduleName = moduleName;
    this.apiVersion = apiVersion;
  }

  @Bean
  public OpenAPI customOpenAPI() {
    final String securitySchemeName = "bearerAuth";
    final String apiTitle = String.format("%s API", StringUtils.capitalize(moduleName));
    return new OpenAPI()
        .addSecurityItem(new SecurityRequirement().addList(securitySchemeName))
        .components(
            new Components()
                .addSecuritySchemes(securitySchemeName,
                    new SecurityScheme()
                        .name(securitySchemeName)
                        .type(SecurityScheme.Type.HTTP)
                        .scheme("bearer")
                        .bearerFormat("JWT")
                )
        )
        .info(new Info().title(apiTitle).version(apiVersion));
  }
}

코드 라인

.addSecurityItem(new SecurityRequirement().addList(securitySchemeName))

를 사용하여 글로벌 보안 스키마를 추가하고 각 @Operation of 메서드에 대한 쓰기 보안을 제거할 수 있습니다.

Open에 대한 글로벌 보안 체계 정의주석을 사용한 API 3.0@io.swagger.v3.oas.annotations.security.SecurityScheme순식간에@Configuration콩:

@Configuration
@OpenAPIDefinition(info = @Info(title = "My API", version = "v1"))
@SecurityScheme(
    name = "bearerAuth",
    type = SecuritySchemeType.HTTP,
    bearerFormat = "JWT",
    scheme = "bearer"
)
public class OpenApi30Config {

}

주석 달기@RestController베어러 토큰 인증(JWT)이 필요한 메서드@io.swagger.v3.oas.annotations.Operation정의된 보안 구성표 참조:

@Operation(summary = "My endpoint", security = @SecurityRequirement(name = "bearerAuth"))

각 항목에 주석을 추가하지 않으려면@Operation마음속에@RestController와 함께security속성은 컨트롤러의 모든 작동에 영향을 미치는 클래스 수준에서 추가할 수 있습니다.

구성 빈은 다른 예와 동일해야 합니다.

@Configuration
@OpenAPIDefinition(info = @Info(title = "My API", version = "v1"))
@SecurityScheme(
    name = "bearerAuth",
    type = SecuritySchemeType.HTTP,
    bearerFormat = "JWT",
    scheme = "bearer"
)
public class OpenApi30Config {
}

클래스 수준에서 보안 요구 사항 추가

당신이 해야 할 일은 그냥 사용하는 것입니다.@SecurityRequirement(name = "bearerAuth")이러한 클래스에서 API 호출을 제한할 수 있습니다.이러한 주석은 상속되므로 모든 인터페이스에 추가할 수도 있습니다.

필요한 주석을 사용하여 마커 인터페이스를 만듭니다.

@SecurityRequirement(name = "bearerAuth")
public interface SecuredRestController {
}

모든 작업에 제한을 적용할 컨트롤러에 마커 인터페이스를 추가합니다. 예:

@RestController
@RequestMapping("/hello")
public class HelloController implements SecuredController {

    @GetMapping
    public String hello() {
        return "Hello World";
    }

    @GetMapping("/{name}")
    public String helloWithName(@PathVariable String name) {
        return "Hello " + name;
    }

}

마커 인터페이스가 다음과 같이 말하지 않아도 이 작업을 수행할 수 있습니다.

@RestController
@RequestMapping("/hello")
@SecurityRequirement(name = "bearerAuth")
public class HelloController {
...
}

이제 작업이 모두 보호되고 JWT 토큰이 필요합니다.

방법 수준에서 보안 요구 사항 추가

다른 게시물에서 말했듯이, 당신은 다음을 추가해야 합니다.@SecurityRequirement당신에게@Operation방법에 대한 주석입니다.

@RestController
@RequestMapping("/hello")
public class HelloController {

    @GetMapping
    @Operation(summary = "My endpoint", security = @SecurityRequirement(name = "bearerAuth"))
    public String hello() {
        return "Hello World";
    }

    @GetMapping("/{name}")
    public String helloWithName(@PathVariable String name) {
        return "Hello " + name;
    }

}

이렇게 하면 첫 번째 작업만 제한되고 두 번째 작업은 제한되지 않습니다.

언급URL : https://stackoverflow.com/questions/59898874/enable-authorize-button-in-springdoc-openapi-ui-for-bearer-token-authentication

반응형