diff --git a/ice-auth/pom.xml b/ice-auth/pom.xml index ab3dfa038c860431706f685098d90eedea2d7547..fe466685a5691c1ccbd5fae5256feea31b29fd3b 100644 --- a/ice-auth/pom.xml +++ b/ice-auth/pom.xml @@ -52,6 +52,12 @@ 0.0.1-SNAPSHOT + + com.icedevcloud + ice-common-swagger + 0.0.1-SNAPSHOT + + com.icedevcloud ice-upms-api diff --git a/ice-auth/src/main/java/com/icedevcloud/auth/config/WebSecurityConfig.java b/ice-auth/src/main/java/com/icedevcloud/auth/config/WebSecurityConfig.java index d0efa1cd9a15fb412686916988dde00f69f50852..cb7de38073bba83934e5b083d5f3c801bf3220fd 100644 --- a/ice-auth/src/main/java/com/icedevcloud/auth/config/WebSecurityConfig.java +++ b/ice-auth/src/main/java/com/icedevcloud/auth/config/WebSecurityConfig.java @@ -5,7 +5,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.annotation.Order; import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -18,8 +17,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() - .antMatchers( - "/actuator/**", "/image-code/**").permitAll() + .antMatchers("/actuator/**", "/image-code/**", + "/doc.html", "/swagger-resources", "/swagger-resources/configuration", "/v3/api-docs", "/v2/api-docs", "/webjars/**").permitAll() .anyRequest().authenticated() .and().csrf().disable(); } diff --git a/ice-auth/src/main/resources/bootstrap.yml b/ice-auth/src/main/resources/bootstrap.yml index 2ab96e4dbd998260a12b84451fbc5c26fe265ce2..616cb2e8d71144478e2d4e60bcc9b283482c26bb 100644 --- a/ice-auth/src/main/resources/bootstrap.yml +++ b/ice-auth/src/main/resources/bootstrap.yml @@ -19,6 +19,17 @@ spring: pathmatch: matching-strategy: ANT_PATH_MATCHER +knife4j: + enable: true + basic: + enable: true + username: admin + password: 123456 + description: ${project.description} + serviceUrl: https://gitee.com/icedevcloud + version: ${project.version} + production: false + management: endpoints: web: diff --git a/ice-common/ice-common-swagger/pom.xml b/ice-common/ice-common-swagger/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..57352da5447924b71641e82af6b21852607aaabd --- /dev/null +++ b/ice-common/ice-common-swagger/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + + com.icedevcloud + ice-common + 0.0.1-SNAPSHOT + + + ice-common-swagger + jar + + ice-common-swagger + + + + org.springframework.boot + spring-boot-autoconfigure + provided + + + + org.springframework + spring-web + provided + + + + com.github.xiaoymin + knife4j-spring + + + + com.github.xiaoymin + knife4j-spring-ui + + + + diff --git a/ice-common/ice-common-swagger/src/main/java/com/icedevcloud/common/swagger/Knife4jAutoConfiguration.java b/ice-common/ice-common-swagger/src/main/java/com/icedevcloud/common/swagger/Knife4jAutoConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..a1e36ac1f4f213769437618f4a4c430953feb137 --- /dev/null +++ b/ice-common/ice-common-swagger/src/main/java/com/icedevcloud/common/swagger/Knife4jAutoConfiguration.java @@ -0,0 +1,140 @@ +package com.icedevcloud.common.swagger; + +import com.github.xiaoymin.knife4j.spring.filter.ProductionSecurityFilter; +import com.github.xiaoymin.knife4j.spring.filter.SecurityBasicAuthFilter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; + +/** + * Knife4jAutoConfiguration + * + * @author XiaoBingBy + * @since 2022-03-02 + */ +@Slf4j +@Configuration +@EnableSwagger2WebMvc +@EnableConfigurationProperties({Knife4jProperties.class}) +@ConditionalOnProperty(name = "knife4j.enable", havingValue = "true") +public class Knife4jAutoConfiguration { + + @Autowired + private Environment environment; + + @Bean(value = "defaultApi2") + @ConditionalOnMissingBean + @ConditionalOnProperty(name = "knife4j.enable", havingValue = "true") + public Docket defaultApi2(Knife4jProperties knife4jProperties) { + String title = environment.getProperty("spring.application.name"); + Docket docket = new Docket(DocumentationType.SWAGGER_2) + .apiInfo(new ApiInfoBuilder() + .title(title) + .description(knife4jProperties.getDescription()) + .termsOfServiceUrl(knife4jProperties.getServiceUrl()) + .contact("IceDevCloud") + .version(knife4jProperties.getVersion()) + .build()) + .select() + .apis(RequestHandlerSelectors.basePackage(knife4jProperties.getBasePackage())) + .paths(PathSelectors.any()) + .build(); + return docket; + } + + /** + * 配置Cors + * + * @return + * @since 2.0.4 + */ + @Bean("knife4jCorsFilter") + @ConditionalOnMissingBean(CorsFilter.class) + @ConditionalOnProperty(name = "knife4j.cors", havingValue = "true") + public CorsFilter corsFilter() { + log.info("init CorsFilter..."); + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration corsConfiguration = new CorsConfiguration(); + corsConfiguration.setAllowCredentials(true); + corsConfiguration.addAllowedOrigin("*"); + corsConfiguration.addAllowedHeader("*"); + corsConfiguration.addAllowedMethod("*"); + corsConfiguration.setMaxAge(10000L); + //匹配所有API + source.registerCorsConfiguration("/**", corsConfiguration); + CorsFilter corsFilter = new CorsFilter(source); + return corsFilter; + } + + @Bean + @ConditionalOnMissingBean(SecurityBasicAuthFilter.class) + @ConditionalOnProperty(name = "knife4j.basic.enable", havingValue = "true") + public SecurityBasicAuthFilter securityBasicAuthFilter(Knife4jProperties knife4jProperties) { + boolean enableSwaggerBasicAuth = false; + String dftUserName = "admin", dftPass = "123321"; + SecurityBasicAuthFilter securityBasicAuthFilter = null; + if (knife4jProperties == null) { + if (environment != null) { + String enableAuth = environment.getProperty("knife4j.basic.enable"); + enableSwaggerBasicAuth = Boolean.valueOf(enableAuth); + if (enableSwaggerBasicAuth) { + //如果开启basic验证,从配置文件中获取用户名和密码 + String pUser = environment.getProperty("knife4j.basic.username"); + String pPass = environment.getProperty("knife4j.basic.password"); + if (pUser != null && !"".equals(pUser)) { + dftUserName = pUser; + } + if (pPass != null && !"".equals(pPass)) { + dftPass = pPass; + } + } + securityBasicAuthFilter = new SecurityBasicAuthFilter(enableSwaggerBasicAuth, dftUserName, dftPass); + } + } else { + //判断非空 + if (knife4jProperties.getBasic() == null) { + securityBasicAuthFilter = new SecurityBasicAuthFilter(enableSwaggerBasicAuth, dftUserName, dftPass); + } else { + securityBasicAuthFilter = new SecurityBasicAuthFilter(knife4jProperties.getBasic().isEnable(), knife4jProperties.getBasic().getUsername(), knife4jProperties.getBasic().getPassword()); + } + } + return securityBasicAuthFilter; + } + + @Bean + @ConditionalOnMissingBean(ProductionSecurityFilter.class) + @ConditionalOnProperty(name = "knife4j.production", havingValue = "true") + public ProductionSecurityFilter productionSecurityFilter(Knife4jProperties knife4jProperties) { + boolean prod = false; + ProductionSecurityFilter p = null; + if (knife4jProperties == null) { + if (environment != null) { + String prodStr = environment.getProperty("knife4j.production"); + if (log.isDebugEnabled()) { + log.debug("swagger.production:{}", prodStr); + } + prod = Boolean.valueOf(prodStr); + } + p = new ProductionSecurityFilter(prod); + } else { + p = new ProductionSecurityFilter(knife4jProperties.isProduction()); + } + + return p; + } + +} diff --git a/ice-common/ice-common-swagger/src/main/java/com/icedevcloud/common/swagger/Knife4jHttpBasic.java b/ice-common/ice-common-swagger/src/main/java/com/icedevcloud/common/swagger/Knife4jHttpBasic.java new file mode 100644 index 0000000000000000000000000000000000000000..49e5db4fad3fd59e8678263e1558e7e729465406 --- /dev/null +++ b/ice-common/ice-common-swagger/src/main/java/com/icedevcloud/common/swagger/Knife4jHttpBasic.java @@ -0,0 +1,50 @@ +package com.icedevcloud.common.swagger; + +/** + * Knife4jHttpBasic + * + * @author XiaoBingBy + * @since 2022-03-02 + */ +public class Knife4jHttpBasic { + + /** + * basick是否开启,默认为false + */ + private boolean enable=false; + + /** + * basic 用户名 + */ + private String username; + + /** + * basic 密码 + */ + private String password; + + public boolean isEnable() { + return enable; + } + + public void setEnable(boolean enable) { + this.enable = enable; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + +} diff --git a/ice-common/ice-common-swagger/src/main/java/com/icedevcloud/common/swagger/Knife4jProperties.java b/ice-common/ice-common-swagger/src/main/java/com/icedevcloud/common/swagger/Knife4jProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..87683a303b2a69e7c2dbe7b28592a2423c4f402f --- /dev/null +++ b/ice-common/ice-common-swagger/src/main/java/com/icedevcloud/common/swagger/Knife4jProperties.java @@ -0,0 +1,57 @@ +package com.icedevcloud.common.swagger; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * Knife4jProperties + * + * @author XiaoBingBy + * @since 2022-03-02 + */ +@Component +@ConfigurationProperties(prefix = "knife4j") +@Data +public class Knife4jProperties { + + /** + * 是否开启Knife4j增强模式 + */ + private boolean enable = false; + /** + * 是否开启默认跨域 + */ + private boolean cors = false; + + /** + * 是否开启BasicHttp验证 + */ + private Knife4jHttpBasic basic; + + /** + * 简介 + */ + private String description; + + /** + * 服务Url + */ + private String serviceUrl; + + /** + * 版本 + */ + private String version; + + /** + * 是否生产环境 + */ + private boolean production = false; + + /** + * 基础包 + */ + private String basePackage = "com.icedevcloud"; + +} diff --git a/ice-common/ice-common-swagger/src/main/resources/META-INF/spring.factories b/ice-common/ice-common-swagger/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000000000000000000000000000000000000..938462b679bd87f1ae08af25865098d2c29162a9 --- /dev/null +++ b/ice-common/ice-common-swagger/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +# Auto Configure +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.icedevcloud.common.swagger.Knife4jAutoConfiguration \ No newline at end of file diff --git a/ice-common/pom.xml b/ice-common/pom.xml index f069569220ddfd60a271004c443522063c5c503f..b7c1321ef809b3f11812f7f0b58d4b120fe8279e 100644 --- a/ice-common/pom.xml +++ b/ice-common/pom.xml @@ -16,6 +16,7 @@ ice-common-core + ice-common-swagger diff --git a/ice-upms/ice-upms-service/pom.xml b/ice-upms/ice-upms-service/pom.xml index 250791f29b3d9b3e59337103b52ca4e522d51dec..6542a29ca4486e0ab474c17f56b9bed16384c0a1 100644 --- a/ice-upms/ice-upms-service/pom.xml +++ b/ice-upms/ice-upms-service/pom.xml @@ -42,6 +42,12 @@ spring-boot-starter-mail + + com.icedevcloud + ice-common-swagger + 0.0.1-SNAPSHOT + + org.springframework.boot spring-boot-starter-test diff --git a/ice-upms/ice-upms-service/src/main/resources/bootstrap.yml b/ice-upms/ice-upms-service/src/main/resources/bootstrap.yml index a7b50dc347094344791cef4d73a03f612693eb48..6a0c077b5b928f39d24e7c4806635ab9afca2a7e 100644 --- a/ice-upms/ice-upms-service/src/main/resources/bootstrap.yml +++ b/ice-upms/ice-upms-service/src/main/resources/bootstrap.yml @@ -18,15 +18,22 @@ spring: mvc: pathmatch: matching-strategy: ANT_PATH_MATCHER - boot: - admin: - client: - url: http://localhost:1024 mail: host: smtp.163.com username: fanshuye1304@163.com password: fanshuye1304 +knife4j: + enable: true + basic: + enable: true + username: admin + password: 123456 + description: ${project.description} + serviceUrl: https://gitee.com/icedevcloud + version: ${project.version} + production: false + management: endpoints: web: diff --git a/pom.xml b/pom.xml index 5330f94f532d7ce3a0576f3625725dc8d99874f1..6f13787074fe3c91dd65435f1da7b22509340504 100644 --- a/pom.xml +++ b/pom.xml @@ -31,12 +31,11 @@ 2.1.18.RELEASE 3.2.0 3.3.1 - 4.5.10 + 5.7.22 2.2.2 - 2.9.2 - 1.5.20 - 1.9.6 - 1.18.8 + 1.5.22 + 2.0.7 + 1.18.22 @@ -112,9 +111,15 @@ - io.springfox - springfox-swagger2 - ${swagger2.version} + com.github.xiaoymin + knife4j-spring + ${knife4j.version} + + + + com.github.xiaoymin + knife4j-spring-ui + ${knife4j.version}