Swagger2 非全局、无需重复输入的Head参数(Token)配置

去我的博客查看

网络上关于Swagger2的教程多如牛毛,关于Swagger加入全局head参数(如token)的文章也很多。例如:

Swagger2 添加HTTP head参数

Swagger2 添加HTTP head参数,解决用户是token信息保留

但上述方案存在2个不足之处:

  1. 需要在每个接口下单独输入参数
  2. 全局配置了参数,如果某些接口(如login等)不需要参数,则必须在改接口中通过annotation现实声明,较为麻烦

综上,选择优化方案如下:

  1. 通过Swagger2的securitySchemes配置全局参数:如下列代码所示,securitySchemes的ApiKey中增加一个名为“Authorization”,type为“header”的参数。
private List<ApiKey> securitySchemes() {
        return newArrayList(
                new ApiKey("Authorization", "Authorization", "header"));
 }
  1. 在Swagger2的securityContexts中通过正则表达式,设置需要使用参数的接口(或者说,是去除掉不需要使用参数的接口),如下列代码所示,通过PathSelectors.regex("^(?!auth).*$"),所有包含"auth"的接口不需要使用securitySchemes。即不需要使用上文中设置的名为“Authorization”,type为“header”的参数。
private List<SecurityContext> securityContexts() {
        return newArrayList(
                SecurityContext.builder()
                        .securityReferences(defaultAuth())
                        .forPaths(PathSelectors.regex("^(?!auth).*$"))
                        .build()
        );
    }

设置完成后进入SwaggerUI,右上角出现“Authorization”按钮,点击即可输入我们配置的参数。
对于不需要输入参数的接口(上文所述的包含auth的接口),在未输入Authorization参数就可以访问。
其他接口则将返回401错误。点击右上角“Authorization”按钮,输入配置的参数后即可访问。参数输入后全局有效,无需每个接口单独输入。


image.png

至此,完成Swagger2 非全局、无需重复输入的Head参数配置。
Swagger2的相关完整代码如下(工程基于Springboot):

@Configuration
@EnableSwagger2
public class Swagger {
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2).
                useDefaultResponseMessages(false)
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.regex("^(?!auth).*$"))
                .build()
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts())
                ;
    }

    private List<ApiKey> securitySchemes() {
        return newArrayList(
                new ApiKey("Authorization", "Authorization", "header"));
    }

    private List<SecurityContext> securityContexts() {
        return newArrayList(
                SecurityContext.builder()
                        .securityReferences(defaultAuth())
                        .forPaths(PathSelectors.regex("^(?!auth).*$"))
                        .build()
        );
    }

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

去我的博客查看

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,198评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,993评论 6 342
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,321评论 1 23
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,263评论 6 13
  • 这一年自己很叛逆,自以为是,不把任何人放在眼里,全世界就我最牛逼知道的最多做法最正确,只有我一个人坚守梦想,只有我...
    嘻嘻嘻东阅读 281评论 0 0