还在手动整合Swagger?Swagger官方Starter是真的香!

SpringBoot实战电商项目mall(40k+star)地址:github.com/macrozheng/…css

摘要

以前项目中整合Swagger都是直接经过依赖springfox-swaggerspringfox-swagger-ui两个jar包来实现的,最近发现springfox 3.0.0版本已经有了本身的SpringBoot Starter,使用起来更契合SpringBoot项目,很是方便,推荐给你们!html

使用官方Starter

咱们先使用官方Starter来整合Swagger看看是否够简单!java

  • 首先在pom.xml中添加springfox官方Swagger依赖;
<!--springfox swagger官方Starter-->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>
复制代码
  • 添加Swagger的Java配置,配置好Api信息和须要生成接口文档的类扫描路径便可;
/** * Swagger2API文档的配置 */
@Configuration
public class Swagger2Config {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.macro.mall.tiny.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("SwaggerUI演示")
                .description("mall-tiny")
                .contact(new Contact("macro", null, null))
                .version("1.0")
                .build();
    }
}
复制代码

  • 两步便可搞定SpringBoot集成Swagger,是否是很简单!

与以前版本相比

以前咱们使用的是springfox 2.9.2版本,接下来对比下3.0.0的SpringBoot Starter使用,看看有何不一样!git

  • 旧版本须要依赖springfox-swagger2springfox-swagger-ui两个配置,新版本一个Starter就搞定了,并且以前的版本若是不使用新版本的swagger-modelsswagger-annotations依赖,访问接口会出现NumberFormatException问题;
<dependencies>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <exclusions>
            <exclusion>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-annotations</artifactId>
            </exclusion>
            <exclusion>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-models</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
    </dependency>
    <!--解决Swagger 2.9.2版本NumberFormatException-->
    <dependency>
        <groupId>io.swagger</groupId>
        <artifactId>swagger-models</artifactId>
        <version>1.6.0</version>
    </dependency>
    <dependency>
        <groupId>io.swagger</groupId>
        <artifactId>swagger-annotations</artifactId>
        <version>1.6.0</version>
    </dependency>
</dependencies>
复制代码

  • 好比说咱们只想在dev环境下启用Swagger文档,而在prod环境下不想启用,旧版本咱们能够经过@Profile注解实现;
@Configuration
@EnableSwagger2
@Profile(value = {"dev"})
public class Swagger2Config {
    
}
复制代码
  • 新版本咱们在SpringBoot配置文件中进行配置便可,springfox.documentation.enabledapplication-dev.yml配置为true,在application-prod.yml中配置为false。

整合Spring Security使用

咱们常常会在项目中使用Spring Security实现登陆认证,接下来咱们来说下如何使用Swagger整合Spring Security,实现访问须要登陆认证的接口。跨域

  • 如何访问须要登陆认证的接口?只需在访问接口时添加一个合法的Authorization请求头便可,下面是Swagger相关配置;
/** * Swagger2API文档的配置 */
@Configuration
public class Swagger2Config {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.macro.mall.tiny.controller"))
                .paths(PathSelectors.any())
                .build()
                //添加登陆认证
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts());
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("SwaggerUI演示")
                .description("mall-tiny")
                .contact(new Contact("macro", null, null))
                .version("1.0")
                .build();
    }

    private List<SecurityScheme> securitySchemes() {
        //设置请求头信息
        List<SecurityScheme> result = new ArrayList<>();
        ApiKey apiKey = new ApiKey("Authorization", "Authorization", "header");
        result.add(apiKey);
        return result;
    }

    private List<SecurityContext> securityContexts() {
        //设置须要登陆认证的路径
        List<SecurityContext> result = new ArrayList<>();
        result.add(getContextByPath("/brand/.*"));
        return result;
    }

    private SecurityContext getContextByPath(String pathRegex) {
        return SecurityContext.builder()
                .securityReferences(defaultAuth())
                .forPaths(PathSelectors.regex(pathRegex))
                .build();
    }

    private List<SecurityReference> defaultAuth() {
        List<SecurityReference> result = new ArrayList<>();
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        result.add(new SecurityReference("Authorization", authorizationScopes));
        return result;
    }
}
复制代码
  • 咱们须要在Spring Security中配置好Swagger静态资源的无受权访问,好比首页访问路径/swagger-ui/
/** * SpringSecurity的配置 * Created by macro on 2018/4/26. */
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UmsAdminService adminService;
    @Autowired
    private RestfulAccessDeniedHandler restfulAccessDeniedHandler;
    @Autowired
    private RestAuthenticationEntryPoint restAuthenticationEntryPoint;

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.csrf()// 因为使用的是JWT,咱们这里不须要csrf
                .disable()
                .sessionManagement()// 基于token,因此不须要session
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .antMatchers(HttpMethod.GET, // 容许对于网站静态资源的无受权访问
                        "/",
                        "/swagger-ui/",
                        "/*.html",
                        "/favicon.ico",
                        "/**/*.html",
                        "/**/*.css",
                        "/**/*.js",
                        "/swagger-resources/**",
                        "/v2/api-docs/**"
                )
                .permitAll()
                .antMatchers("/admin/login")// 对登陆注册要容许匿名访问
                .permitAll()
                .antMatchers(HttpMethod.OPTIONS)//跨域请求会先进行一次options请求
                .permitAll()
                .anyRequest()// 除上面外的全部请求所有须要鉴权认证
                .authenticated();
        // 省略若干配置......
    }
}
复制代码
  • 调用登陆接口获取token,帐号密码为admin:123456

  • 点击Authorize按钮后输入Authorization请求头,以后就能够访问须要登陆认证的接口了。

总结

Swagger官方Starter解决了以前整合Swagger的一系列问题,简化了SpringBoot整合Swagger的过程,使用起来更加方便了。同时对于一些复杂的配置使用基本没有变化,一些以前的使用方式依然可使用!restful

项目源码地址

github.com/macrozheng/…markdown

本文 GitHub github.com/macrozheng/… 已经收录,欢迎你们Star!

相关文章
相关标签/搜索