【Swagger2源码级教学】06统一认证

​ 当我们需要用户带着token访问我的的接口时,Swagger2通过配置统一认证可以实现全局token认证。

​ 我们继续关注Docket里面的方法,我们需要通过下面两个方法实现全局token认证,先看代码。

在这里插入图片描述

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;

/**
 * TODO
 *
 * @author ben
 * @version 1.0
 * @date 2022/9/13 11:23
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {
    //http://127.0.0.1:8080/swagger-ui.html#/
    @Bean
    public Docket docket() {
        return new Docket(DocumentationType.SWAGGER_2)
                //配置文档信息
                .apiInfo(apiInfo())
                //控制Swagger2的开启与关闭
                .enable(true)
                //扫描行为
                .select()
                //接口扫描 不匹配任何controller的接口
                // .apis(RequestHandlerSelectors.none())
                //扫描指定包路径  参数为 包路径的字符串
                .apis(RequestHandlerSelectors.basePackage("cn.ben.for_learn_projects.swagger2config.controller"))
                /// 任何请求都扫描
                .paths(PathSelectors.any())
                .build()
//                增加Authorization请求头
            	// 设置鉴权方式
                .securitySchemes(securitySchemes())
            	//设置鉴权范围
                .securityContexts(securityContexts());
    }

    //配置文档信息
    private ApiInfo apiInfo() {
        Contact contact = new Contact("ben", "https://xxxxxx.com", "Swagger2Config@SpringBoot.com");
        return new ApiInfo(
                "Ben的学习总结", // 标题
                "Swagger2Config", // 描述
                "v1.0", // 版本
                "https://xxxxxx.com", // 组织链接
                contact, // 联系人信息
                "Apach 2.0 许可", // 许可
                "https://xxxxxx.com", // 许可连接
                new ArrayList<>()// 扩展
        );
    }

   //设置鉴权策略
    private List<ApiKey> securitySchemes() {
        List<ApiKey> apiKeys = new ArrayList<>();
        apiKeys.add(new ApiKey("yanzheng", "Authorization", "header"));
        return apiKeys;
    }
    
	 // 配置默认的全局鉴权策略的开关,以及通过正则表达式进行匹配;默认 ^.*$ 匹配所有URL
    // *其中 securityReferences 为配置启用的鉴权策略
    private List<SecurityContext> securityContexts() {
        List<SecurityContext> securityContexts = new ArrayList<>();
        securityContexts.add(SecurityContext.builder()
                .securityReferences(defaultAuth())
                .forPaths(PathSelectors.regex("^(?!auth).*$")).build());
        return securityContexts;
    }

    private List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        List<SecurityReference> securityReferences = new ArrayList<>();
        //SecurityReference对象中的第一个参数需要和ApiKey中的name相同,实现计划和范围匹配
        securityReferences.add(new SecurityReference("yanzheng", authorizationScopes));
        return securityReferences;
    }
}

securitySchemes()方法

我们先看到第二个方法:

在这里插入图片描述

​ 该方法参数类型为一个ListList 中的类型为继承于SecurityScheme的一个对象,那我们看看SecurityScheme

在这里插入图片描述

发现它是一个抽象类,那我们继续看看它的实现类:

在这里插入图片描述

那我们知道了Swagger-ui为我们提供了三种鉴权方式,这次我要讲的是第一种,使用ApiKey对象。

在这里插入图片描述

​ 通过Api对象的构造函数设置 API 密钥的名字(可任意取),键名,和所处位置。

   //设置鉴权方式
    private List<ApiKey> securitySchemes() {
        List<ApiKey> apiKeys = new ArrayList<>();
        apiKeys.add(new ApiKey("yanzheng", "Authorization", "header"));
        return apiKeys;
    }
    

​ 该段代码设置鉴权方式为ApiKey,该API密钥的名字是yanzheng(验证),作用于header(请求头)的Authorization键中。(我们知道请求头使用键值对存储信息。)

​ 注:这里我是为了与Authorization区分开才取的yanzheng,按照约定,应当name参数与keyname相同,即yanzheng应当改为Authorization。

securityContexts(List securityContexts)

第二个方法是配置鉴权的作用范围,我们只需要关注这两行代码:

在这里插入图片描述

​ defaultAuth()中通过AuthorizationScope对象的构造函数配置了作用域,在通过SecurityReference()对象和上面的鉴权方式匹配。

​ forPaths() 中放入要生效的接口路径的正则表达式,如 .forPaths(PathSelectors.regex(“^(?!auth).*$”)) 表示所有带有 auth的接口路径。此处,使用 PathSelectors.any() 表示所有接口路径都生效。

当我们没有使用鉴权时,

在这里插入图片描述

请求头内没有鉴权信息

当我们开启鉴权后:

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-id2ypn7s-1663375343742)(C:/Users/ben/AppData/Roaming/Typora/typora-user-images/image-20220915205830385.png)]
再次发起请求:

在这里插入图片描述

请求头内已经有你的token了。

至此你已经能够熟练使用Swagger2了。祝贺你!

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值