在 springdoc-openapi-ui 中为不记名令牌认证 (JWT) 启用授权按钮

Evg*_*yst 23 java spring jwt openapi springdoc

如何在springdoc-openapi-ui (OpenAPI 3.0 /swagger-ui.html) 中为不记名令牌认证启用“授权”按钮,例如 JWT。

Spring@Controller@Configuration类需要添加哪些注解?

授权按钮

不记名令牌认证的授权表

Jen*_*aBY 45

我更喜欢使用 bean 初始化而不是注释。

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));
  }
}
Run Code Online (Sandbox Code Playgroud)

代码行

.addSecurityItem(new SecurityRequirement().addList(securitySchemeName))
Run Code Online (Sandbox Code Playgroud)

允许添加全局安全模式并摆脱对每个@Operation 方法的写入安全性。

  • 导入 io.swagger.v3.oas.models.Components; 导入 io.swagger.v3.oas.models.OpenAPI; 导入 io.swagger.v3.oas.models.info.Info; 导入 io.swagger.v3.oas.models.security.SecurityRequirement; 导入 io.swagger.v3.oas.models.security.SecurityScheme; 导入 org.springframework.beans.factory.annotation.Value; 导入 org.springframework.context.annotation.Bean; 导入 org.springframework.context.annotation.Configuration; 导入 org.springframework.util.StringUtils; ---- 添加导入命令,因为有几个不明确的选项 (4认同)

Evg*_*yst 33

定义一个全局安全方案为3.0 OpenAPI的使用注释@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 {

}
Run Code Online (Sandbox Code Playgroud)

@RestController通过@io.swagger.v3.oas.annotations.Operation引用定义的安全方案来注释每个需要承载令牌身份验证 (JWT) 的方法:

@Operation(summary = "My endpoint", security = @SecurityRequirement(name = "bearerAuth"))
Run Code Online (Sandbox Code Playgroud)


Ore*_*esz 9

如果您想避免 使用属性注释每个@Operation内部,您可以在类级别添加它,影响控制器的每个操作。@RestControllersecurity

在类级别添加安全要求

你所要做的就是@SecurityRequirement(name = "bearerAuth")在那些你想限制 API 调用的类上使用。请注意,这些注释是继承的,因此您也可以将它们添加到任何界面。

使用所需的注释创建一个标记界面:

@SecurityRequirement(name = "bearerAuth")
public interface SecuredRestController {
}
Run Code Online (Sandbox Code Playgroud)

将标记接口添加到您希望将限制应用于所有操作的那些控制器,例如:

@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;
    }

}
Run Code Online (Sandbox Code Playgroud)

您可以在没有标记界面的情况下执行此操作,只需说:

@RestController
@RequestMapping("/hello")
@SecurityRequirement(name = "bearerAuth")
public class HelloController {
...
}
Run Code Online (Sandbox Code Playgroud)

现在,您的操作都受到保护并需要 JWT 令牌。 在此处输入图片说明

在方法级别添加安全要求

正如在另一篇文章中所说,您必须将 the 添加@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;
    }

}
Run Code Online (Sandbox Code Playgroud)

这仅限制第一个操作,而不限制第二个操作。 在此处输入图片说明

请不要忘记您的配置 bean 需要与其他示例中的相同:

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