SpringBoot集成Swagger3接口文档及添加Authorization授权

swagger可以为前端提供接口文档及接口测试功能,后端集成起来很方便,对代码也没有入侵,全注解完成,非常好用。

一、集成基础功能

第一步、添加依赖

        <!-- swagger3 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>

 第二步、创建配置文件Swagger3Config

@Configuration
@EnableOpenApi
public class Swagger3Config {

    @Bean
    public Docket docket() {
        return new Docket(DocumentationType.OAS_30)
                .apiInfo(apiInfo())
                .select()
                // 自行修改为自己的接口路径,不配置扫描全部路径
                .apis(RequestHandlerSelectors.basePackage("com.by.hellosecurityresource.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Swagger3 API文档")
                .description("RESTFul 风格接口")
                .version("1.0")
                .build();
    }


}

第三步、给接口添加注解

@Api(tags = "测试不需要登录验证就能访问的接口")

@RestController
@RequestMapping("/noAuth")
public class NoAuthController {

    /**
     * 服务对象
     */
    private TestService testService;

    public NoAuthController(TestService testService) {
        this.testService = testService;
    }

    @Operation(summary = "获取test列表数据")
    @RequestMapping(value = "", method = RequestMethod.GET)
    public Page<STest> list(@RequestParam @Parameter(description = "页数从1开始", required = true) int page,
                            @RequestParam @Parameter(description = "每页的条数", required = true) int limit,
                            HttpServletRequest request) {

        return testService.list(page - 1, limit);

    }

}

Api  给Controller添加的注解

Operation 给Contoller里的方法添加的注解

Parameter 给方法中参数添加的注解

Schema 给实体类及其变量添加的注解

@Schema(description = "test数据")
@Setter
@Getter
public class TestRequestBean {

    @Schema(description = "测试字段1")
    private String test;

    @Schema(description = "测试字段2")
    private String value;
    

}

访问地址: baseUrl/swagger-ui/index.html

 二、让swgger文档支持授权访问

修改配置文件,使swagger支持添加token

@Configuration
@EnableOpenApi
public class Swagger3Config {

    @Bean
    public Docket docket() {
        return new Docket(DocumentationType.OAS_30)
                .apiInfo(apiInfo())
                .select()
                // 自行修改为自己的接口路径,不配置扫描全部路径
                .apis(RequestHandlerSelectors.basePackage("com.by.hellosecurityresource.controller"))
                .paths(PathSelectors.any())
                .build()//;
                .securitySchemes(securitySchemes())
                .securityContexts(Collections.singletonList(securityContext()));
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Swagger3 API文档")
                .description("RESTFul 风格接口")
                .version("1.0")
                .build();
    }

    private List<SecurityScheme> securitySchemes() {
        List<SecurityScheme> apiKeyList= new ArrayList<>();
        //注意,这里应对应登录token鉴权对应的k-v
        apiKeyList.add(new ApiKey("Authorization", "Authorization", "header"));
        return apiKeyList;
    }

    /**
     * 这里设置 swagger2 认证的安全上下文
     */
    private SecurityContext securityContext() {
        return SecurityContext.builder()
                .securityReferences(Collections.singletonList(new SecurityReference("Authorization", scopes())))
                .build();
    }

    /**
     * 这里是写允许认证的scope
     */
    private AuthorizationScope[] scopes() {
        return new AuthorizationScope[]{
                new AuthorizationScope("web", "All scope is trusted!")
        };
    }

}

ResourseServer配置中,过滤以下路径,使不通过验证就能访问到,否则无法打开swagger文档

"/swagger-ui/**"
"/swagger-resources/**"
"/v3/**"

示例代码如下

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/noAuth/**", "/swagger-ui/**", "/swagger-resources/**", "/v3/**").permitAll() //设置/oauth/**的接口不需要授权就可以访问
                .anyRequest().authenticated();
    }

 再次访问接口文档,会有此按钮标记 

 点击可输入token

这样,在swagger中测试接口的时候就会带上token了。

三、生产服务器注意关闭swagger文档 

在applicaiton中添加配置

springfox:
  documentation:
    auto-startup: false #false关闭swagger文档 true打开swagger

测试代码地址:

Hello-Security: OAuth2授权服务器

### 如何在 Swagger 3 中传递 Token 进行身份验证 在 Swagger 3 中,可以通过配置 `securitySchemes` 来支持基于 API Key 的身份验证机制。这种机制允许开发者通过 HTTP 请求头部传递 Token 值以完成身份验证。 以下是具体实现方法: #### 配置 Security Schemes Swagger 使用 OpenAPI 规范来描述 API 接口的安全性需求。为了支持 Token 身份验证,可以在 `components.securitySchemes` 下定义一种安全方案。例如,可以定义一个名为 `bearerAuth` 的安全方案,其类型为 `apiKey` 并指定参数位于请求头中[^4]。 ```yaml components: securitySchemes: bearerAuth: # 定义安全方案名称 type: apiKey # 类型为 API 密钥 name: Authorization # 自定义 Header 名称 in: header # 参数位置为请求头 ``` 上述代码片段表示客户端需要在每次请求时,在请求头中加入形如 `Authorization: Bearer <token>` 的字段。 #### 应用安全性到路径操作 一旦定义好安全方案后,还需要将其应用至具体的 API 路径上或者整个文档范围内的所有路径。这一步骤可通过设置全局级别的 `security` 字段或针对单个路径单独声明来达成目的。 对于单一路径而言,如下所示: ```yaml paths: /protected-resource: get: summary: 获取受保护资源 security: # 设置该路径所需的安全措施 - bearerAuth: [] # 引用之前定义好的 &#39;bearerAuth&#39; 方案 responses: &#39;200&#39;: description: 成功返回数据 ``` 如果希望所有的 API 默认都需要经过认证,则可以直接放在根节点下作为默认行为的一部分: ```yaml openapi: 3.0.0 ... security: - bearerAuth: [] ``` 这样做的效果就是除非特别指明某些特定端点不需要任何形式的身份验证外,默认情况下访问这些服务都需提供有效的令牌信息才能获得响应内容。 #### 测试阶段准备 当完成了以上两步之后,在实际运行环境中打开生成出来的交互式 UI 页面(即通常所说的 swagger-ui),应该能够发现右上方多出了一个按钮用于输入 Access Token 。点击它并填入相应的值比如 `"Bearer your_token_here"` ,然后确认提交即可激活当前会话期间持续附加此凭证给后续发出的所有请求直至手动清除为止[^5]。 --- ### 总结 综上所述,在 Swagger 3 中实现 Token 身份验证主要涉及三个方面的操作:一是正确编写 OpenAPI 描述文件中的 `securitySchemes` 和关联的 `security` 属性;二是确保后端框架能解析来自前端发送过来带有所述标记的数据包结构;三是利用官方提供的工具栏功能方便快捷地模拟真实场景下的调用过程以便调试优化程序逻辑[^1][^2][^3]. ```python # 示例 Python Flask JWT 认证处理函数 from flask import request, jsonify def authenticate(): auth_header = request.headers.get(&#39;Authorization&#39;) if not auth_header or &#39;Bearer&#39; not in auth_header: return jsonify({"error": "Missing token"}), 401 try: token = auth_header.split(" ")[1] decode_jwt(token) # 解码JWT并校验有效性 except Exception as e: return jsonify({"error": str(e)}), 401 return None # 如果一切正常则继续执行下一步业务流程 ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LO嘉嘉VE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值