swagger2 配合 spring security oauth2 實現(xiàn)api文檔

前前言

spring security Oauth2 和 swagger2 是什么呢宾尚?簡單介紹一下降淮,但是如果不明白的話不適合看這個文章醇锚。

  • spring security Oauth2
    一個很好用的安全框架,可以很輕松的實現(xiàn)細粒度的接口防護
  • swagger2
    這是一個動態(tài)生成 api 文檔的東西改艇,有了這個東西媽媽再也不用擔心一邊維護代碼一邊維護文檔了。

前言

spring security Oauth2 的使用在我的其他博客中也講到了坟岔,這里就不在敘述谒兄。這篇文章主要講述的就是我們的應用已經被 spring security Oauth2 保護的情況下,集成 swagger2 生成api文檔社付。

大概實現(xiàn)步驟

  1. 引入 pom 依賴(假如你的項目是使用 Maven 管理承疲,如果使用的不是 Maven 的話你知道該怎么做)
  2. refresh 一下 pom (有的小朋友會遺忘)
  3. 新建一個 swagger2 的配置類
  4. 把 swagger2 使用的接口放行(被 Oauth2 攔了還玩?zhèn)€毛線)

具體編碼實現(xiàn)

  1. pom依賴
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.8.0</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.8.0</version>
</dependency>

這里注意我使用的是2.8.0版本,為什么是這個版本呢鸥咖?我試了2.9.x燕鸽,也試了2.7.x,有一些問題只有2.8.0解決了啼辣,例如“接口返回示例”部分只有2.8.0按照Java類書寫的順序顯示啊研,其他版本是按照字符串順序顯示。其他問題我就不一一列舉了鸥拧,大家嘗試一下党远,也沒必要一定使用2.8.0。更換版本的話只需要改一下 pom 里面的版本即可住涉,其他配置不用變麸锉。jsonview 組件截止鄙人寫博客的時候 swagger2 都沒有支持

  1. 新建 swagger2 配置類
package com.ybk.ordering.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.OAuthBuilder;
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.Arrays;
import java.util.Collections;
//把import寫進來主要是為了確保萬無一失

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    //這個東西是項目的根路徑,也就是“/oauth/token”前面的那一串
    //這個東西在配置文件里寫的舆声,大家也可以直接寫死在配置文件中
    @Value("${auth_server}")
    private String AUTH_SERVER;

    /**
     * 主要是這個方法花沉,其他的方法是抽出去的,所以大家不要害怕為啥有這么多方法
     * 在 basePackage 里面寫需要生成文檔的 controller 路徑
     */
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.ybk.ordering.controller"))
                .paths(PathSelectors.any())
                .build()
                .apiInfo(apiInfo())
                .securitySchemes(Collections.singletonList(securityScheme()))
                .securityContexts(Collections.singletonList(securityContext()));
    }

    /**
     * 這個方法主要是寫一些文檔的描述
     */
    private ApiInfo apiInfo() {
        return new ApiInfo(
                "某某系統(tǒng)API",
                "This is a very pretty document!",
                "1.0",
                "",
                new Contact("師父領進門", "", "qixiazhen@qq.com"),
                "", "", Collections.emptyList());
    }

    /**
     * 這個類決定了你使用哪種認證方式媳握,我這里使用密碼模式
     * 其他方式自己摸索一下碱屁,完全莫問題啊
     */
    private SecurityScheme securityScheme() {
        GrantType grantType = new ResourceOwnerPasswordCredentialsGrant(AUTH_SERVER + "/oauth/token");

        return new OAuthBuilder()
                .name("spring_oauth")
                .grantTypes(Collections.singletonList(grantType))
                .scopes(Arrays.asList(scopes()))
                .build();
    }

    /**
     * 這里設置 swagger2 認證的安全上下文
     */
    private SecurityContext securityContext() {
        return SecurityContext.builder()
                              .securityReferences(Collections.singletonList(new SecurityReference("spring_oauth", scopes())))
                              .forPaths(PathSelectors.any())
                              .build();
    }

    /**
     * 這里是寫允許認證的scope
     */
    private AuthorizationScope[] scopes() {
        return new AuthorizationScope[]{
                new AuthorizationScope("all", "All scope is trusted!")
        };
    }

}

大體上就些配置,如果有哪些方法調用我沒說明白或者沒法兒理解的話用 IDE 進去看看源碼的注釋基本也就明白了蛾找。

  1. Oauth2 放行 swagger2
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers(
                    "/webjars/**",
                    "/resources/**",
                    "/swagger-ui.html",
                    "/swagger-resources/**",
                    "/v2/api-docs")
            .permitAll();
    }
}

如你所見娩脾,配置寫在資源服務器里面。這里是簡化的代碼打毛,實際使用中你在原有配置的基礎上把我上面寫的這些路徑放行即可柿赊。

  1. 完成了俩功,試一試

瀏覽器打開項目根路徑/swagger-ui.html,我這里揪一個生產環(huán)境上的例子給你們瞟一眼

swagger2主頁

現(xiàn)在點擊圖片右上角那個Authorize按鈕
認證

然后正常的輸入信息認證即可訪問接口了

后記

這篇文章的重點主要是在 spring security Oauth2 下使用 swagger2 碰声,所以關于 swagger2 的一些注解就不詳細講了诡蜓,例如@Api@ApiParam等等胰挑,大家可以邊查邊用蔓罚,很簡單。

穩(wěn)當當瞻颂!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末豺谈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贡这,更是在濱河造成了極大的恐慌茬末,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藕坯,死亡現(xiàn)場離奇詭異团南,居然都是意外死亡,警方通過查閱死者的電腦和手機炼彪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門吐根,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辐马,你說我怎么就攤上這事拷橘。” “怎么了喜爷?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵冗疮,是天一觀的道長。 經常有香客問我檩帐,道長术幔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任湃密,我火速辦了婚禮诅挑,結果婚禮上,老公的妹妹穿的比我還像新娘泛源。我一直安慰自己拔妥,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布达箍。 她就那樣靜靜地躺著没龙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上硬纤,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天解滓,我揣著相機與錄音,去河邊找鬼筝家。 笑死伐蒂,一個胖子當著我的面吹牛,可吹牛的內容都是我干的肛鹏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼恩沛,長吁一口氣:“原來是場噩夢啊……” “哼在扰!你這毒婦竟也來了?” 一聲冷哼從身側響起雷客,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤芒珠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后搅裙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皱卓,經...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年部逮,在試婚紗的時候發(fā)現(xiàn)自己被綠了娜汁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡兄朋,死狀恐怖掐禁,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情颅和,我是刑警寧澤傅事,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站峡扩,受9級特大地震影響蹭越,放射性物質發(fā)生泄漏。R本人自食惡果不足惜教届,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一响鹃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧巍佑,春花似錦茴迁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春倦卖,著一層夾襖步出監(jiān)牢的瞬間洒擦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工怕膛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留熟嫩,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓褐捻,卻偏偏與公主長得像掸茅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子柠逞,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內容