你的Swagger2 API直接公開?來加把鎖!

前面咱們學習了Spring Boot集成swagger2的具體操做,但swagger2默認是沒有權限控制的,也就是說若是是在內網還好,要是在公網上使用,那麼對應接口文檔信息將出現安全問題。html

這篇文章咱們就結合SpringBoot中SpringSecurity來進行設置,讓經過swagger2生成的接口文檔也擁有訪問權限,而且不影響其餘業務的正常使用。web

SpringSecurity

目前Web開發經常使用的兩個安全框架:Apache Shiro和Spring Security,Spring Security自己是Spring社區的一個子架構,相對而言對Spring有更好的支持。spring

默認狀況下,Spring Security提供了權限、角色、登陸等功能。關於Spring Security的詳細功能咱們後面會專門用來介紹。這裏咱們直接按照步驟集成使用便可。api

功能實現

在swagger2集成項目的基礎上引入Spring Security的依賴:安全

 

  •  
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional></dependency><dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version></dependency><dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version></dependency><!-- spring security 鑑權 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency>

其中spring-boot-starter-security是針對Spring Security框架,Spring Boot提供的對應的starter。架構

配置application

引入依賴以後,在application中配置對應的配置項:app

spring.security.user.name=admin
spring.security.user.password=admin

這樣,當啓動服務時,訪問任意連接,默認都會跳轉到Spring Security的登陸頁面。並且上述配置指定了用來登陸的用戶名和密碼。框架

配置類

關於swagger2的配置類以下:ide

  •  
@Configuration@EnableSwagger2public class Swagger2Config {
@Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) // 返回ApiSelectorBuilder實例,用來控制對哪些接口進行展示 .select() // 掃描須要生成API文檔的controller所在的包路徑 .apis(RequestHandlerSelectors.basePackage("com.secbro.controller")) .paths(PathSelectors.any()) .build(); }
private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("Spring Boot 2.x集成Swagger") .description("用戶管理 API 1.0 操做文檔") .termsOfServiceUrl("http://www.choupangxia.com/") .version("1.0") .contact(new Contact("程序新視界", "http://www.choupangxia.com/", "secbro2@gmail.com")) .build(); }}

以前文章已經講過,咱們這裏就不贅述了。咱們知道swagger2默認訪問的路徑爲:http://localhost:8080/swagger-ui.html。spring-boot

下面咱們經過對Spring Security的配置,來有針對性的限制swagger2的訪問,具體配置以下:

 

@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter {
/** * http訪問控制 */ @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/api/**").permitAll() // 具體接口鑑權交由業務系統shiro或token等機制來控制,這裏只控制swagger2相關 .anyRequest().authenticated() .and() .formLogin() .permitAll(); }}

建立一個配置類,而後繼承自WebSecurityConfigurerAdapter,並重寫其configure方法。在該方法中能夠定義具體攔截的url以及登陸相關的配置。

其中antMatchers("/api/**").permitAll()是排除原有業務系統的請求地址。

爲何要排除?由於咱們如今只是針對swagger2的訪問進行限制,而業務系統自己可能已經有具體其餘權限限制了,好比已經使用shiro或者使用攔截器等功能進行權限認證了,若是咱們這裏再進行攔截,業務系統的api可能就沒法正常調用了。

anyRequest().authenticated()指定除了業務系統的接口以外,其餘的請求(確保其餘的只有swagger2的請求)均須要通過security。

and().formLogin().permitAll()指定登陸的form表單及權限。

至此,當訪問其餘業務系統時security不會影響,而當訪問swagger2時,便會彈出以下登陸框: 

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

登陸以後,才能看到具體的接口文檔信息。而針對接口文檔中的業務api的調用,可經過相似antMatchers("/api/**").permitAll()的形式進行逐步排除。

小結

上面咱們經過集成SpringSecurity來達到限制swagger2的目的。但在某些狀況下咱們可能須要讓swagger2可直接顯示,而其餘接口須要登陸。這個時候,反向操做便可。

也就是經過排除swagger2的限制來達到目的。不過在這個過程當中須要注意的是不能僅僅排除swagger-ui.html,還需排除swagger2所依賴的靜態資源,不然也不會正確顯示頁面。其實這也是不少人會遇到的一個坑。你能夠嘗試一下。

《SpringBoot視頻教程全家桶》的視頻課程第一階段已經錄製完成,目前111節課程。後續還會不斷新增其餘實戰場景、組件的內容。同時也會不斷補充像本篇文章這樣的實戰經驗。

相關文章
相關標籤/搜索