Просмотр исходного кода

feat: springboot配置项修改 剔除不必要逻辑

yangliu 3 месяцев назад
Родитель
Сommit
128c452606
26 измененных файлов с 710 добавлено и 531 удалено
  1. 165 0
      knife4j-doc-spring-boot-starter/README.md
  2. 27 0
      knife4j-doc-spring-boot-starter/pom.xml
  3. 52 0
      knife4j-doc-spring-boot-starter/src/main/java/cn/hfln/framework/knife4j/doc/base/BaseSwaggerConfig.java
  4. 55 0
      knife4j-doc-spring-boot-starter/src/main/java/cn/hfln/framework/knife4j/doc/base/SwaggerProperties.java
  5. 55 0
      knife4j-doc-spring-boot-starter/src/main/java/cn/hfln/framework/knife4j/doc/configure/DocAutoConfigure.java
  6. 70 0
      knife4j-doc-spring-boot-starter/src/main/java/cn/hfln/framework/knife4j/doc/gateway/Knife4jGatewayConfig.java
  7. 108 0
      knife4j-doc-spring-boot-starter/src/main/java/cn/hfln/framework/knife4j/doc/properties/DocProperties.java
  8. 3 0
      knife4j-doc-spring-boot-starter/src/main/resources/META-INF/spring.factories
  9. 30 0
      knife4j-doc-spring-boot-starter/src/main/resources/application.yml
  10. 79 67
      pom.xml
  11. 5 2
      src/main/java/cn/hfln/framework/gateway/GatewayApplication.java
  12. 0 32
      src/main/java/cn/hfln/framework/gateway/authorization/AuthorizationManager.java
  13. 0 21
      src/main/java/cn/hfln/framework/gateway/componet/RestAuthenticationEntryPoint.java
  14. 0 22
      src/main/java/cn/hfln/framework/gateway/componet/RestfulAccessDeniedHandler.java
  15. 0 66
      src/main/java/cn/hfln/framework/gateway/config/ResourceServerConfig.java
  16. 0 56
      src/main/java/cn/hfln/framework/gateway/config/SwaggerResourceConfig.java
  17. 0 12
      src/main/java/cn/hfln/framework/gateway/constant/AuthConstant.java
  18. 0 72
      src/main/java/cn/hfln/framework/gateway/filter/AuthGlobalFilter.java
  19. 0 46
      src/main/java/cn/hfln/framework/gateway/filter/IgnoreUrlsRemoveJwtFilter.java
  20. 0 57
      src/main/java/cn/hfln/framework/gateway/handler/SwaggerHandler.java
  21. 0 0
      src/main/resources/application-dev.yml
  22. 0 0
      src/main/resources/application-local.yml
  23. 0 0
      src/main/resources/application-prod.yml
  24. 0 15
      src/main/resources/application-test.yml
  25. 61 0
      src/main/resources/application.yml
  26. 0 63
      src/main/resources/bootstrap.yml

+ 165 - 0
knife4j-doc-spring-boot-starter/README.md

@@ -0,0 +1,165 @@
+# Knife4j Doc Starter 使用说明
+
+基于 Knife4j 4.x + OpenAPI 3 规范的接口文档增强解决方案。
+
+## 特性
+
+- 基于 OpenAPI 3 规范
+- 支持 Spring Cloud Gateway 网关聚合文档
+- 支持 JWT 等安全认证配置
+- 支持接口分组管理
+- 支持中文界面
+
+## 快速开始
+
+### 1. 微服务中使用
+
+在需要暴露 API 文档的微服务的 `pom.xml` 中添加依赖:
+
+```xml
+<dependency>
+    <groupId>cn.hfln.framework</groupId>
+    <artifactId>knife4j-doc-spring-boot-starter</artifactId>
+    <version>${project.version}</version>
+</dependency>
+```
+
+在 `application.yml` 中添加配置:
+
+```yaml
+lnxx:
+  knife4j:
+    doc:
+      enable: true
+      base-package: com.your.package  # 接口所在包路径
+      title: 服务名称
+      description: 服务描述
+      version: ${project.version}
+      enable-security: true  # 是否启用安全认证
+```
+
+### 2. Gateway 网关中使用
+
+#### 2.1 添加依赖
+
+在网关项目的 `pom.xml` 中添加依赖:
+
+```xml
+<dependency>
+    <groupId>cn.hfln.framework</groupId>
+    <artifactId>knife4j-doc-spring-boot-starter</artifactId>
+    <version>${project.version}</version>
+</dependency>
+```
+
+#### 2.2 网关配置
+
+在网关的 `application.yml` 中添加如下配置:
+
+```yaml
+spring:
+  cloud:
+    gateway:
+      routes:
+        # 文档聚合路由
+        - id: knife4j
+          uri: http://localhost:${server.port}
+          predicates:
+            - Path=/v3/api-docs/**
+          filters:
+            - RewritePath=/v3/api-docs/(?<path>.*), /$\{path}/v3/api-docs
+
+lnxx:
+  knife4j:
+    doc:
+      enable: true
+      title: API 文档中心
+      description: 微服务接口文档
+      version: ${project.version}
+      enable-security: true
+
+# 配置需要聚合的微服务文档
+springdoc:
+  swagger-ui:
+    path: /doc.html
+  api-docs:
+    enabled: true
+  group-configs:
+    - group: 'default'
+      paths-to-match: '/**'
+      packages-to-scan: cn.hfln
+```
+
+#### 2.3 创建网关聚合配置类
+
+```java
+@Configuration
+public class Knife4jGatewayConfig {
+    
+    @Bean
+    public RouterFunction<ServerResponse> apiRouter() {
+        return RouterFunctions.route()
+            .GET("/v3/api-docs/swagger-config", request ->
+                ServerResponse.ok().bodyValue(swaggerConfig()))
+            .build();
+    }
+
+    private Map<String, Object> swaggerConfig() {
+        Map<String, Object> config = new HashMap<>();
+        // 配置要聚合的微服务,key 为服务名,value 为文档地址
+        Map<String, String> services = new HashMap<>();
+        services.put("用户服务", "/user-service/v3/api-docs");
+        services.put("订单服务", "/order-service/v3/api-docs");
+        // ... 添加更多服务
+        
+        config.put("urls", services);
+        return config;
+    }
+}
+```
+
+### 3. 访问文档
+
+- 单个服务文档地址:`http://服务地址:端口/doc.html`
+- 网关聚合文档地址:`http://网关地址:端口/doc.html`
+
+## 注意事项
+
+1. 网关聚合时,确保所有微服务的 OpenAPI 文档都已启用
+2. 如果启用了安全认证,需要在 Swagger UI 界面配置对应的认证信息
+3. 建议在生产环境关闭或限制文档访问
+4. 网关层建议配置文档访问的路由限制
+
+## 常见问题
+
+1. 文档无法访问
+   - 检查服务是否正常启动
+   - 检查网关路由配置是否正确
+   - 检查安全认证配置
+
+2. 网关聚合失败
+   - 检查微服务的文档地址是否可访问
+   - 检查网关路由配置是否正确
+   - 检查网络连通性
+
+3. 认证失败
+   - 检查认证配置是否正确
+   - 确认 Token 格式是否正确
+   - 检查认证服务是否正常
+
+## 配置说明
+
+| 配置项 | 说明 | 默认值 |
+|-------|------|--------|
+| lnxx.knife4j.doc.enable | 是否启用文档 | true |
+| lnxx.knife4j.doc.base-package | 接口扫描包路径 | - |
+| lnxx.knife4j.doc.title | 文档标题 | API 文档 |
+| lnxx.knife4j.doc.description | 文档描述 | - |
+| lnxx.knife4j.doc.version | 文档版本 | 1.0.0 |
+| lnxx.knife4j.doc.enable-security | 是否启用安全认证 | false |
+
+## 版本说明
+
+- 基于 Knife4j 4.x
+- 支持 Spring Boot 2.6.x 及以上版本
+- 支持 Spring Cloud 2021.x 及以上版本

+ 27 - 0
knife4j-doc-spring-boot-starter/pom.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>hfln-framework-design-starter</artifactId>
+        <groupId>cn.hfln.framework</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>knife4j-doc-spring-boot-starter</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-openapi3-spring-boot-starter</artifactId>
+            <version>${knife4j.version}</version>
+        </dependency>
+    </dependencies>
+
+</project>

+ 52 - 0
knife4j-doc-spring-boot-starter/src/main/java/cn/hfln/framework/knife4j/doc/base/BaseSwaggerConfig.java

@@ -0,0 +1,52 @@
+package cn.hfln.framework.knife4j.doc.base;
+
+import io.swagger.v3.oas.models.Components;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Contact;
+import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.security.SecurityRequirement;
+import io.swagger.v3.oas.models.security.SecurityScheme;
+import io.swagger.v3.oas.models.servers.Server;
+import java.util.Collections;
+
+/**
+ * @USER: YangLiu
+ * @DESC: 基础 Swagger 配置类,供其他模块继承和自定义
+ */
+public abstract class BaseSwaggerConfig {
+    
+    /**
+     * 自定义Swagger配置
+     */
+    public abstract SwaggerProperties swaggerProperties();
+
+    /**
+     * 创建自定义的 OpenAPI 配置
+     */
+    protected OpenAPI createOpenAPI(SwaggerProperties swaggerProperties) {
+        OpenAPI openAPI = new OpenAPI()
+                .info(new Info()
+                        .title(swaggerProperties.getTitle())
+                        .description(swaggerProperties.getDescription())
+                        .version(swaggerProperties.getVersion())
+                        .contact(new Contact()
+                                .name(swaggerProperties.getContactName())
+                                .url(swaggerProperties.getContactUrl())
+                                .email(swaggerProperties.getContactEmail())));
+
+        if (swaggerProperties.getServerUrl() != null && !swaggerProperties.getServerUrl().isEmpty()) {
+            openAPI.setServers(Collections.singletonList(new Server().url(swaggerProperties.getServerUrl())));
+        }
+
+        if (swaggerProperties.isEnableSecurity()) {
+            openAPI.addSecurityItem(new SecurityRequirement().addList("Authorization"))
+                    .components(new Components()
+                            .addSecuritySchemes("Authorization",
+                                    new SecurityScheme()
+                                            .type(SecurityScheme.Type.HTTP)
+                                            .scheme("bearer")
+                                            .bearerFormat("JWT")));
+        }
+        return openAPI;
+    }
+}

+ 55 - 0
knife4j-doc-spring-boot-starter/src/main/java/cn/hfln/framework/knife4j/doc/base/SwaggerProperties.java

@@ -0,0 +1,55 @@
+package cn.hfln.framework.knife4j.doc.base;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @USER: YangLiu
+ * @DESC:
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Builder
+public class SwaggerProperties {
+    /**
+     * API文档生成基础路径
+     */
+    private String apiBasePackage;
+    /**
+     * 是否要启用登录认证
+     */
+    private boolean enableSecurity;
+    /**
+     * 文档标题
+     */
+    private String title;
+    /**
+     * 文档描述
+     */
+    private String description;
+    /**
+     * 文档版本
+     */
+    private String version;
+    /**
+     * 文档联系人姓名
+     */
+    private String contactName;
+    /**
+     * 文档联系人网址
+     */
+    private String contactUrl;
+    /**
+     * 文档联系人邮箱
+     */
+    private String contactEmail;
+    /**
+     * API 分组名称
+     */
+    private String group;
+    /**
+     * OpenAPI servers 字段,支持网关前缀
+     */
+    private String serverUrl;
+}

+ 55 - 0
knife4j-doc-spring-boot-starter/src/main/java/cn/hfln/framework/knife4j/doc/configure/DocAutoConfigure.java

@@ -0,0 +1,55 @@
+package cn.hfln.framework.knife4j.doc.configure;
+
+import cn.hfln.framework.knife4j.doc.base.BaseSwaggerConfig;
+import cn.hfln.framework.knife4j.doc.base.SwaggerProperties;
+import cn.hfln.framework.knife4j.doc.properties.DocProperties;
+import io.swagger.v3.oas.models.OpenAPI;
+import org.springdoc.core.SpringDocConfiguration;
+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.context.annotation.Import;
+import org.springframework.context.annotation.Primary;
+
+/**
+ * @USER: YangLiu
+ * knife4j 接口文档配置
+ */
+@Configuration
+@EnableConfigurationProperties(DocProperties.class)
+@ConditionalOnProperty(value = "lnxx.knife4j.doc.enable", havingValue = "true", matchIfMissing = true)
+@Import(SpringDocConfiguration.class)
+public class DocAutoConfigure extends BaseSwaggerConfig {
+
+    private final DocProperties properties;
+
+    public DocAutoConfigure(DocProperties properties) {
+        this.properties = properties;
+    }
+
+    @Bean
+    @Primary
+    @ConditionalOnMissingBean
+    public OpenAPI customOpenAPI() {
+        return createOpenAPI(swaggerProperties());
+    }
+
+    @Override
+    public SwaggerProperties swaggerProperties() {
+        return SwaggerProperties.builder()
+                .apiBasePackage(properties.getBasePackage())
+                .title(properties.getTitle())
+                .description(String.format("<div style='font-size:%spx;color:%s;'>%s</div>",
+                        properties.getDescriptionFontSize(), properties.getDescriptionColor(), properties.getDescription()))
+                .version(properties.getVersion())
+                .contactName(properties.getName())
+                .contactUrl(properties.getUrl())
+                .contactEmail(properties.getEmail())
+                .enableSecurity(properties.isEnableSecurity())
+                .group("default")
+                .serverUrl(properties.getServerUrl())
+                .build();
+    }
+}

+ 70 - 0
knife4j-doc-spring-boot-starter/src/main/java/cn/hfln/framework/knife4j/doc/gateway/Knife4jGatewayConfig.java

@@ -0,0 +1,70 @@
+package cn.hfln.framework.knife4j.doc.gateway;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.reactive.function.server.RouterFunction;
+import org.springframework.web.reactive.function.server.RouterFunctions;
+import org.springframework.web.reactive.function.server.ServerResponse;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Gateway 网关 Knife4j 聚合配置示例
+ * 仅在 WebFlux 环境下生效
+ */
+@Configuration
+@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
+public class Knife4jGatewayConfig {
+
+    @Bean
+    public RouterFunction<ServerResponse> apiRouter() {
+        return RouterFunctions.route()
+                .GET("/v3/api-docs/swagger-config", request ->
+                        ServerResponse.ok().bodyValue(swaggerConfig()))
+                .build();
+    }
+
+    private Map<String, Object> swaggerConfig() {
+        Map<String, Object> config = new HashMap<>(8);
+        config.put("urls", buildServiceUrls());
+        return config;
+    }
+
+    private List<ServiceUrl> buildServiceUrls() {
+        List<ServiceUrl> serviceUrls = new ArrayList<>();
+        // 这里添加需要聚合的服务,实际项目中可以从注册中心动态获取
+        serviceUrls.add(new ServiceUrl("用户服务", "/user-service/v3/api-docs"));
+        serviceUrls.add(new ServiceUrl("订单服务", "/order-service/v3/api-docs"));
+        return serviceUrls;
+    }
+
+    static class ServiceUrl {
+        private String name;
+        private String url;
+
+        public ServiceUrl(String name, String url) {
+            this.name = name;
+            this.url = url;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public String getUrl() {
+            return url;
+        }
+
+        public void setUrl(String url) {
+            this.url = url;
+        }
+    }
+} 

+ 108 - 0
knife4j-doc-spring-boot-starter/src/main/java/cn/hfln/framework/knife4j/doc/properties/DocProperties.java

@@ -0,0 +1,108 @@
+package cn.hfln.framework.knife4j.doc.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * @USER: YangLiu
+ */
+@ConfigurationProperties(prefix = "lnxx.knife4j.doc")
+@Data
+public class DocProperties {
+
+    /**
+     * 是否开启doc功能
+     */
+    private Boolean enable = true;
+    /**
+     * 接口扫描路径,如Controller路径
+     */
+    private String basePackage;
+
+
+    /**
+     * 是否要启用登录认证
+     */
+    private boolean enableSecurity = false;
+
+    /**
+     * 文档标题
+     */
+    private String title;
+    /**
+     * 文档描述
+     */
+    private String description;
+    /**
+     * 文档描述颜色
+     */
+    private String descriptionColor = "#42b983";
+    /**
+     * 文档描述字体大小
+     */
+    private String descriptionFontSize = "14";
+    /**
+     * 服务url
+     */
+    private String termsOfServiceUrl;
+    /**
+     * 联系方式:姓名
+     */
+    private String name;
+    /**
+     * 联系方式:个人网站url
+     */
+    private String url;
+    /**
+     * 联系方式:邮箱
+     */
+    private String email;
+    /**
+     * 协议
+     */
+    private String license;
+    /**
+     * 协议地址
+     */
+    private String licenseUrl;
+    /**
+     * 版本
+     */
+    private String version;
+
+    /**
+     * 网关前缀(OpenAPI servers 字段)
+     */
+    private String serverUrl;
+
+    /**
+     * 支持yml多server配置
+     */
+    private java.util.List<ServerConfig> servers;
+
+    @lombok.Data
+    public static class ServerConfig {
+        private String url;
+        private String description;
+    }
+
+    @Override
+    public String toString() {
+        return "DocProperties{" +
+                "enable=" + enable +
+                ", basePackage='" + basePackage + '\'' +
+                ", title='" + title + '\'' +
+                ", description='" + description + '\'' +
+                ", descriptionColor='" + descriptionColor + '\'' +
+                ", descriptionFontSize='" + descriptionFontSize + '\'' +
+                ", termsOfServiceUrl='" + termsOfServiceUrl + '\'' +
+                ", name='" + name + '\'' +
+                ", url='" + url + '\'' +
+                ", email='" + email + '\'' +
+                ", license='" + license + '\'' +
+                ", licenseUrl='" + licenseUrl + '\'' +
+                ", version='" + version + '\'' +
+                ", serverUrl='" + serverUrl + '\'' +
+                '}';
+    }
+}

+ 3 - 0
knife4j-doc-spring-boot-starter/src/main/resources/META-INF/spring.factories

@@ -0,0 +1,3 @@
+# Auto Configure
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+cn.hfln.framework.knife4j.doc.configure.DocAutoConfigure

+ 30 - 0
knife4j-doc-spring-boot-starter/src/main/resources/application.yml

@@ -0,0 +1,30 @@
+spring:
+  mvc:
+    pathmatch:
+      matching-strategy: ANT_PATH_MATCHER
+
+springdoc:
+  swagger-ui:
+    path: /swagger-ui.html
+  api-docs:
+    path: /v3/api-docs
+  group-configs:
+    - group: 'default'
+      paths-to-match: '/**'
+      packages-to-scan: ${lnxx.knife4j.doc.base-package}
+
+knife4j:
+  enable: true
+  setting:
+    language: zh-CN
+    enable-swagger-models: true
+    enable-document-manage: true
+    swagger-model-name: 实体类列表
+    enable-version: false
+    enable-reload-cache-parameter: false
+    enable-after-script: true
+    enable-filter-multipart-api-method-type: POST
+    enable-filter-multipart-apis: false
+    enable-request-cache: true
+    enable-host: false
+    enable-host-text: 

+ 79 - 67
pom.xml

@@ -3,13 +3,6 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
-    <parent>
-        <groupId>cn.hfln.framework</groupId>
-        <artifactId>hfln-framework-parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-        <relativePath/>
-    </parent>
-
     <groupId>cn.hfln.framework</groupId>
     <artifactId>hfln-interior-gateway</artifactId>
     <version>1.0.0-SNAPSHOT</version>
@@ -17,41 +10,65 @@
     <description>hfln-interior-gateway</description>
 
     <properties>
-        <java.version>1.8</java.version> <!-- Update Java version -->
-        <spring-boot.version>2.3.12.RELEASE</spring-boot.version> <!-- Update Spring Boot version -->
-        <spring-cloud.version>Hoxton.SR12</spring-cloud.version> <!-- Update Spring Cloud version -->
-        <nimbus-jose-jwt.version>9.1</nimbus-jose-jwt.version> <!-- Update Nimbus JWT version -->
+        <java.version>1.8</java.version>
+
+        <spring-boot.version>2.6.14</spring-boot.version>
+        <spring-cloud.version>2021.0.8</spring-cloud.version>
+        <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
     </properties>
 
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring-cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>com.alibaba.cloud</groupId>
+                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
+                <version>${spring-cloud-alibaba.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
     <dependencies>
         <dependency>
             <groupId>cn.hfln.framework</groupId>
             <artifactId>hfln-framework-dto</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>cn.hfln.framework</groupId>
-            <artifactId>hfln-framework-common</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.springframework</groupId>
-                    <artifactId>spring-webmvc</artifactId>
-                </exclusion>
-            </exclusions>
+            <artifactId>hfln-framework-exception</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
         </dependency>
-
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
+            <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>com.alibaba.fastjson2</groupId>
             <artifactId>fastjson2</artifactId>
+            <version>2.0.41</version>
         </dependency>
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
+            <version>5.8.16</version>
         </dependency>
-
         <!-- 注册中心配置中心相关 -->
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
@@ -61,66 +78,65 @@
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
         </dependency>
-
+        <!-- 网关 -->
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-gateway</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.cloud</groupId>
+                    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
-
-        <dependency>
-            <groupId>org.springframework.security</groupId>
-            <artifactId>spring-security-config</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.security</groupId>
-            <artifactId>spring-security-oauth2-resource-server</artifactId>
-        </dependency>
-
+        <!-- Actuator -->
         <dependency>
-            <groupId>org.springframework.security</groupId>
-            <artifactId>spring-security-oauth2-client</artifactId>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
         </dependency>
+        <!-- 日志 -->
         <dependency>
-            <groupId>org.springframework.security</groupId>
-            <artifactId>spring-security-oauth2-jose</artifactId>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-logging</artifactId>
         </dependency>
-
-        <!-- 接口文档 -->
         <dependency>
-            <groupId>com.github.xiaoymin</groupId>
-            <artifactId>knife4j-micro-spring-boot-starter</artifactId>
+            <groupId>org.codehaus.janino</groupId>
+            <artifactId>janino</artifactId>
+            <version>3.1.7</version>
         </dependency>
         <dependency>
-            <groupId>com.github.xiaoymin</groupId>
-            <artifactId>knife4j-spring-boot-starter</artifactId>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-webflux</artifactId>
         </dependency>
-
-        <!-- JWT(Json Web Token)登录支持 -->
         <dependency>
-            <groupId>io.jsonwebtoken</groupId>
-            <artifactId>jjwt</artifactId>
-            <version>0.9.0</version>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
         </dependency>
-
-        <!-- Nimbus JWT支持 -->
+        <!-- 添加 Knife4j WebFlux 依赖 -->
         <dependency>
-            <groupId>com.nimbusds</groupId>
-            <artifactId>nimbus-jose-jwt</artifactId>
-            <version>${nimbus-jose-jwt.version}</version>
-        </dependency>
+            <groupId>cn.hfln.framework</groupId>
+            <artifactId>knife4j-doc-spring-boot-starter</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+        </dependency>
+        
+<!--        &lt;!&ndash; WebFlux 文档支持 &ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>org.springdoc</groupId>-->
+<!--            <artifactId>springdoc-openapi-webflux-ui</artifactId>-->
+<!--            <version>1.6.15</version>-->
+<!--        </dependency>-->
+<!--        -->
+<!--        <dependency>-->
+<!--            <groupId>org.springdoc</groupId>-->
+<!--            <artifactId>springdoc-openapi-webflux-core</artifactId>-->
+<!--            <version>1.6.15</version>-->
+<!--        </dependency>-->
 
         <dependency>
-            <groupId>org.codehaus.janino</groupId>
-            <artifactId>janino</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-actuator</artifactId>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-openapi3-ui</artifactId>
+            <version>4.1.0</version>
         </dependency>
-
-
-
     </dependencies>
 
     <build>
@@ -129,7 +145,7 @@
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
-                <version>${spring-boot.version}</version>
+                <version>2.6.14</version>
                 <executions>
                     <execution>
                         <goals>
@@ -137,10 +153,6 @@
                         </goals>
                     </execution>
                 </executions>
-                <configuration>
-                    <classifier>boot</classifier>
-                    <mainClass>cn.hfln.framework.gateway.GatewayApplication</mainClass>
-                </configuration>
             </plugin>
         </plugins>
     </build>

+ 5 - 2
src/main/java/cn/hfln/framework/gateway/GatewayApplication.java

@@ -1,11 +1,14 @@
 package cn.hfln.framework.gateway;
 
-import cn.hfln.framework.common.redis.RedisConfig;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 
-@SpringBootApplication(scanBasePackages = {"cn.hfln.framework.gateway"},scanBasePackageClasses = {RedisConfig.class})
+@SpringBootApplication(
+    scanBasePackages = {"cn.hfln.framework.gateway"},
+    exclude = {RedisAutoConfiguration.class}
+)
 @EnableDiscoveryClient
 public class GatewayApplication {
 

+ 0 - 32
src/main/java/cn/hfln/framework/gateway/authorization/AuthorizationManager.java

@@ -1,32 +0,0 @@
-package cn.hfln.framework.gateway.authorization;
-
-import cn.hfln.framework.gateway.config.IgnoreUrlsConfig;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.security.authorization.AuthorizationDecision;
-import org.springframework.security.authorization.ReactiveAuthorizationManager;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.web.server.authorization.AuthorizationContext;
-import org.springframework.stereotype.Component;
-import reactor.core.publisher.Mono;
-
-/**
- * @USER: YangLiu
- */
-@Component
-@Slf4j
-public class AuthorizationManager implements ReactiveAuthorizationManager<AuthorizationContext> {
-
-    private final IgnoreUrlsConfig ignoreUrlsConfig;
-
-    public AuthorizationManager(IgnoreUrlsConfig ignoreUrlsConfig) {
-        this.ignoreUrlsConfig = ignoreUrlsConfig;
-    }
-
-
-    @Override
-    public Mono<AuthorizationDecision> check(Mono<Authentication> mono, AuthorizationContext authorizationContext) {
-
-        return Mono.just(new AuthorizationDecision(true));
-    }
-
-}

+ 0 - 21
src/main/java/cn/hfln/framework/gateway/componet/RestAuthenticationEntryPoint.java

@@ -1,21 +0,0 @@
-package cn.hfln.framework.gateway.componet;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.web.server.ServerAuthenticationEntryPoint;
-import org.springframework.stereotype.Component;
-import org.springframework.web.server.ServerWebExchange;
-import reactor.core.publisher.Mono;
-
-/**
- * @USER: YangLiu
- * 自定义返回结果:没有登录或token过期时
- */
-@Component
-@Slf4j
-public class RestAuthenticationEntryPoint implements ServerAuthenticationEntryPoint {
-    @Override
-    public Mono<Void> commence(ServerWebExchange exchange, AuthenticationException e) {
-        return new ResultHandler().handle(exchange,e);
-    }
-}

+ 0 - 22
src/main/java/cn/hfln/framework/gateway/componet/RestfulAccessDeniedHandler.java

@@ -1,22 +0,0 @@
-package cn.hfln.framework.gateway.componet;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.security.access.AccessDeniedException;
-import org.springframework.security.web.server.authorization.ServerAccessDeniedHandler;
-import org.springframework.stereotype.Component;
-import org.springframework.web.server.ServerWebExchange;
-import reactor.core.publisher.Mono;
-
-
-/**
- * @USER: YangLiu
- * 自定义返回结果:没有权限访问时
- */
-@Component
-@Slf4j
-public class RestfulAccessDeniedHandler implements ServerAccessDeniedHandler {
-    @Override
-    public Mono<Void> handle(ServerWebExchange exchange, AccessDeniedException e) {
-        return new ResultHandler().handle(exchange,e);
-    }
-}

+ 0 - 66
src/main/java/cn/hfln/framework/gateway/config/ResourceServerConfig.java

@@ -1,66 +0,0 @@
-package cn.hfln.framework.gateway.config;
-
-import cn.hutool.core.util.ArrayUtil;
-
-import cn.hfln.framework.gateway.authorization.AuthorizationManager;
-import cn.hfln.framework.gateway.componet.RestAuthenticationEntryPoint;
-import cn.hfln.framework.gateway.componet.RestfulAccessDeniedHandler;
-import cn.hfln.framework.gateway.constant.AuthConstant;
-import cn.hfln.framework.gateway.filter.IgnoreUrlsRemoveJwtFilter;
-import lombok.AllArgsConstructor;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.convert.converter.Converter;
-import org.springframework.security.authentication.AbstractAuthenticationToken;
-import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
-import org.springframework.security.config.web.server.SecurityWebFiltersOrder;
-import org.springframework.security.config.web.server.ServerHttpSecurity;
-import org.springframework.security.oauth2.jwt.Jwt;
-import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter;
-import org.springframework.security.oauth2.server.resource.authentication.JwtGrantedAuthoritiesConverter;
-import org.springframework.security.oauth2.server.resource.authentication.ReactiveJwtAuthenticationConverterAdapter;
-import org.springframework.security.web.server.SecurityWebFilterChain;
-import reactor.core.publisher.Mono;
-
-/**
- * @USER: YangLiu
- */
-@AllArgsConstructor
-@Configuration
-@EnableWebFluxSecurity
-public class ResourceServerConfig {
-    private final AuthorizationManager authorizationManager;
-    private final IgnoreUrlsConfig ignoreUrlsConfig;
-    private final RestfulAccessDeniedHandler restfulAccessDeniedHandler;
-    private final RestAuthenticationEntryPoint restAuthenticationEntryPoint;
-    private final IgnoreUrlsRemoveJwtFilter ignoreUrlsRemoveJwtFilter;
-
-    @Bean
-    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
-        http.oauth2ResourceServer().jwt()
-                .jwtAuthenticationConverter(jwtAuthenticationConverter());
-        //自定义处理JWT请求头过期或签名错误的结果
-        http.oauth2ResourceServer().authenticationEntryPoint(restAuthenticationEntryPoint);
-        //对白名单路径,直接移除JWT请求头
-        http.addFilterBefore(ignoreUrlsRemoveJwtFilter,SecurityWebFiltersOrder.AUTHENTICATION);
-        http.authorizeExchange()
-                .pathMatchers(ArrayUtil.toArray(ignoreUrlsConfig.getUrls(),String.class)).permitAll()//白名单配置
-                .anyExchange().access(authorizationManager)//鉴权管理器配置
-                .and().exceptionHandling()
-                .accessDeniedHandler(restfulAccessDeniedHandler)//处理未授权
-                .authenticationEntryPoint(restAuthenticationEntryPoint)//处理未认证
-                .and().csrf().disable();
-        return http.build();
-    }
-
-    @Bean
-    public Converter<Jwt, ? extends Mono<? extends AbstractAuthenticationToken>> jwtAuthenticationConverter() {
-        JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
-        jwtGrantedAuthoritiesConverter.setAuthorityPrefix(AuthConstant.AUTHORITY_PREFIX);
-        jwtGrantedAuthoritiesConverter.setAuthoritiesClaimName(AuthConstant.AUTHORITY_CLAIM_NAME);
-        JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter();
-        jwtAuthenticationConverter.setJwtGrantedAuthoritiesConverter(jwtGrantedAuthoritiesConverter);
-        return new ReactiveJwtAuthenticationConverterAdapter(jwtAuthenticationConverter);
-    }
-
-}

+ 0 - 56
src/main/java/cn/hfln/framework/gateway/config/SwaggerResourceConfig.java

@@ -1,56 +0,0 @@
-package cn.hfln.framework.gateway.config;
-
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.cloud.gateway.config.GatewayProperties;
-import org.springframework.cloud.gateway.route.RouteLocator;
-import org.springframework.cloud.gateway.support.NameUtils;
-import org.springframework.context.annotation.Primary;
-import org.springframework.stereotype.Component;
-import springfox.documentation.swagger.web.SwaggerResource;
-import springfox.documentation.swagger.web.SwaggerResourcesProvider;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @USER: YangLiu
- * Swagger资源配置
- */
-@Slf4j
-@Component
-@Primary
-@AllArgsConstructor
-public class SwaggerResourceConfig implements SwaggerResourcesProvider {
-
-    private final RouteLocator routeLocator;
-    private final GatewayProperties gatewayProperties;
-
-    @Override
-    public List<SwaggerResource> get() {
-        List<SwaggerResource> resources = new ArrayList<>();
-        List<String> routes = new ArrayList<>();
-        //获取所有路由的ID
-        routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
-        //过滤出配置文件中定义的路由->过滤出Path Route Predicate->根据路径拼接成api-docs路径->生成SwaggerResource
-        gatewayProperties.getRoutes().stream().filter(
-                routeDefinition -> routes.contains(routeDefinition.getId())).forEach(route -> {
-            route.getPredicates().stream()
-                    .filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName()))
-                    .forEach(predicateDefinition -> resources.add(swaggerResource(route.getId(),
-                            predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0")
-                                    .replace("**", "v2/api-docs"))));
-        });
-
-        return resources;
-    }
-
-    private SwaggerResource swaggerResource(String name, String location) {
-        log.info("name:{},location:{}", name, location);
-        SwaggerResource swaggerResource = new SwaggerResource();
-        swaggerResource.setName(name);
-        swaggerResource.setLocation(location);
-        swaggerResource.setSwaggerVersion("2.0");
-        return swaggerResource;
-    }
-}

+ 0 - 12
src/main/java/cn/hfln/framework/gateway/constant/AuthConstant.java

@@ -1,12 +0,0 @@
-package cn.hfln.framework.gateway.constant;
-
-/**
- * @USER: YangLiu
- */
-public interface AuthConstant {
-    String AUTHORITY_PREFIX = "ROLE_";
-    String AUTHORITY_CLAIM_NAME = "authorities";
-    String JWT_TOKEN_HEADER = "Authorization";
-    String JWT_TOKEN_PREFIX = "Bearer ";
-    String USER_TOKEN_HEADER = "user";
-}

+ 0 - 72
src/main/java/cn/hfln/framework/gateway/filter/AuthGlobalFilter.java

@@ -1,72 +0,0 @@
-package cn.hfln.framework.gateway.filter;
-
-import cn.hfln.framework.common.constant.SecurityConstants;
-import cn.hfln.framework.common.redis.service.RedisService;
-import cn.hfln.framework.gateway.constant.AuthConstant;
-import cn.hutool.core.util.StrUtil;
-import com.nimbusds.jose.JWSObject;
-import com.nimbusds.jose.Payload;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cloud.gateway.filter.GatewayFilterChain;
-import org.springframework.cloud.gateway.filter.GlobalFilter;
-import org.springframework.core.Ordered;
-import org.springframework.http.server.reactive.ServerHttpRequest;
-import org.springframework.stereotype.Component;
-import org.springframework.web.server.ServerWebExchange;
-import reactor.core.publisher.Mono;
-
-import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
-import java.util.Map;
-
-/**
- * 拦截JWT设置token信息
- * @author YangLiu
- */
-@Component
-@Slf4j
-public class AuthGlobalFilter implements GlobalFilter, Ordered {
-
-    @Autowired
-    private RedisService redisService;
-
-    @Override
-    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
-        ServerHttpRequest request = exchange.getRequest();
-        String token = request.getHeaders().getFirst(AuthConstant.JWT_TOKEN_HEADER);
-
-        if (StrUtil.isBlank(token)) {
-            return chain.filter(exchange);
-        }
-
-        try {
-            // 解析JWT,提取用户信息
-            String realToken = token.replace(AuthConstant.JWT_TOKEN_PREFIX, "");
-            JWSObject jwsObject = JWSObject.parse(realToken);
-            Payload payload = jwsObject.getPayload();
-            Map<String, Object> payloadMap = payload.toJSONObject();
-
-            String userKey = String.valueOf(payloadMap.get(SecurityConstants.USER_KEY));
-
-            // 重新构建带用户信息的请求头
-            request = request.mutate()
-                    .header(SecurityConstants.USER_KEY, userKey)
-                    .header(SecurityConstants.DETAILS_USER_ID, String.valueOf(payloadMap.get(SecurityConstants.DETAILS_USER_ID)))
-                    .header(SecurityConstants.DETAILS_USERNAME, String.valueOf(payloadMap.get(SecurityConstants.DETAILS_USERNAME)))
-                    .header(SecurityConstants.REAL_NAME, URLEncoder.encode(String.valueOf(payloadMap.get(SecurityConstants.REAL_NAME)), StandardCharsets.UTF_8.name()))
-                    .build();
-
-            exchange = exchange.mutate().request(request).build();
-        } catch (Exception e) {
-            log.error("AuthGlobalFilter.filter() JWT Parse Exception: {}", e.getMessage(), e);
-        }
-
-        return chain.filter(exchange);
-    }
-
-    @Override
-    public int getOrder() {
-        return 0;
-    }
-}

+ 0 - 46
src/main/java/cn/hfln/framework/gateway/filter/IgnoreUrlsRemoveJwtFilter.java

@@ -1,46 +0,0 @@
-package cn.hfln.framework.gateway.filter;
-
-import cn.hfln.framework.gateway.config.IgnoreUrlsConfig;
-import cn.hfln.framework.gateway.constant.AuthConstant;
-import org.springframework.http.server.reactive.ServerHttpRequest;
-import org.springframework.stereotype.Component;
-import org.springframework.util.AntPathMatcher;
-import org.springframework.util.PathMatcher;
-import org.springframework.web.server.ServerWebExchange;
-import org.springframework.web.server.WebFilter;
-import org.springframework.web.server.WebFilterChain;
-import reactor.core.publisher.Mono;
-
-import java.net.URI;
-import java.util.List;
-
-/**
- * @USER: YangLiu
- * 拦截去除白名单中JWT信息
- */
-@Component
-public class IgnoreUrlsRemoveJwtFilter implements WebFilter {
-    private final IgnoreUrlsConfig ignoreUrlsConfig;
-
-    public IgnoreUrlsRemoveJwtFilter(IgnoreUrlsConfig ignoreUrlsConfig) {
-        this.ignoreUrlsConfig = ignoreUrlsConfig;
-    }
-
-    @Override
-    @SuppressWarnings("all")
-    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
-        ServerHttpRequest request = exchange.getRequest();
-        URI uri = request.getURI();
-        PathMatcher pathMatcher = new AntPathMatcher();
-        //白名单路径移除JWT请求头
-        List<String> ignoreUrls = ignoreUrlsConfig.getUrls();
-        for (String ignoreUrl : ignoreUrls) {
-            if (pathMatcher.match(ignoreUrl, uri.getPath())) {
-                request = exchange.getRequest().mutate().header(AuthConstant.JWT_TOKEN_HEADER, "").build();
-                exchange = exchange.mutate().request(request).build();
-                return chain.filter(exchange);
-            }
-        }
-        return chain.filter(exchange);
-    }
-}

+ 0 - 57
src/main/java/cn/hfln/framework/gateway/handler/SwaggerHandler.java

@@ -1,57 +0,0 @@
-package cn.hfln.framework.gateway.handler;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-import reactor.core.publisher.Mono;
-import springfox.documentation.swagger.web.*;
-
-import java.util.Optional;
-
-/**
- * @USER: YangLiu
- * @DESC: 通过Http获取业务服务的资源配置
- */
-@RestController
-@SuppressWarnings("all")
-public class SwaggerHandler {
-
-
-    @Autowired(required = false)
-    private SecurityConfiguration securityConfiguration;
-    @Autowired(required = false)
-    private UiConfiguration uiConfiguration;
-    @Autowired(required = false)
-    private SwaggerResourcesProvider swaggerResources;
-
-
-    /**
-     * Swagger安全配置,支持oauth和apiKey设置
-     */
-    @GetMapping("/swagger-resources/configuration/security")
-    public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration() {
-        return Mono.just(new ResponseEntity<>(
-                Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()),
-                HttpStatus.OK));
-    }
-
-    /**
-     * Swagger UI配置
-     */
-    @GetMapping("/swagger-resources/configuration/ui")
-    public Mono<ResponseEntity<UiConfiguration>> uiConfiguration() {
-        return Mono.just(new ResponseEntity<>(
-                Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()),
-                HttpStatus.OK));
-    }
-
-    /**
-     * Swagger资源配置,获取各个服务的api-docs信息
-     */
-    @GetMapping("/swagger-resources")
-    public Mono<ResponseEntity<?>> swaggerResources() {
-        return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));
-    }
-}

+ 0 - 0
src/main/resources/bootstrap-dev.yml → src/main/resources/application-dev.yml


+ 0 - 0
src/main/resources/bootstrap-local.yml → src/main/resources/application-local.yml


+ 0 - 0
src/main/resources/bootstrap-prod.yml → src/main/resources/application-prod.yml


+ 0 - 15
src/main/resources/bootstrap-test.yml → src/main/resources/application-test.yml

@@ -11,28 +11,13 @@ spring:
         namespace: test
         file-extension: yaml
   redis:
-    # 地址
     host: 8.130.28.21
-    # 端口
     port: 6379
-    # 数据库索引
     database: 5
-    # 密码
-    password: Hfln@1024
-    # 连接超时时间
     timeout: 10s
     lettuce:
       pool:
-        # 连接池中的最小空闲连接
         min-idle: 0
-
-        # 连接池中的最大空闲连接
         max-idle: 8
-        # 连接池的最大数据库连接数
         max-active: 8
-        # #连接池最大阻塞等待时间(使用负值表示没有限制)
         max-wait: -1ms
-security:
-  captcha:
-    enabled: false
-    type: char

+ 61 - 0
src/main/resources/application.yml

@@ -0,0 +1,61 @@
+server:
+  port: 8090
+spring:
+  profiles:
+    active: test
+  application:
+    name: hfln-interior-gateway
+  cloud:
+    gateway:
+      discovery:
+        locator:
+          enabled: true
+          lower-case-service-id: true
+      routes:
+        - id: portal-service-server
+          uri: lb://portal-service-server
+          predicates:
+            - Path=/portal-service-server/**
+          filters:
+            - StripPrefix=1
+
+# 文档配置
+lnxx:
+  knife4j:
+    doc:
+      enable: true
+      title: HFLN 内部网关
+      description: 网关接口文档
+      version: 1.0.0
+      base-package: cn.hfln.framework.gateway
+      serverUrl: /portal-service-server
+
+springdoc:
+  swagger-ui:
+    path: /doc.html
+  api-docs:
+    enabled: true
+  group-configs:
+    - group: '门户服务'
+      paths-to-match: /portal-service-server/**
+      packages-to-scan: cn.hfln
+
+# 安全配置
+secure:
+  ignore:
+    urls:
+      - "/doc.html"
+      - "/swagger-resources/**"
+      - "/swagger/**"
+      - "/v3/api-docs/**"
+      - "/**/v2/api-docs"
+      - "/**/*.js"
+      - "/**/*.css"
+      - "/**/*.png"
+      - "/**/*.ico"
+      - "/webjars/**"
+      - "/actuator/**"
+      - "/auth/oauth/token"
+      - "/auth/oauth/check_token"
+      - "/auth/oauth/token_key"
+      - "/auth/rsa/publicKey"

+ 0 - 63
src/main/resources/bootstrap.yml

@@ -1,63 +0,0 @@
-server:
-  port: 8090
-spring:
-  profiles:
-    active: dev
-  application:
-    name: hfln-interior-gateway
-  cloud:
-    gateway:
-      discovery:
-        locator:
-          enabled: true
-          lower-case-service-id: true #????service-id
-      routes: #??????
-        - id: portal-service-server
-          uri: lb://portal-service-server
-          predicates:
-            - Path=/portal-service-server/**
-          filters:
-            - StripPrefix=1
-
-        - id: test
-          uri: lb://test
-          predicates:
-            - Path=/test/**
-          filters:
-            - StripPrefix=1
-
-
-  # RSA密钥地址
-  security:
-    oauth2:
-      resourceserver:
-        jwt:
-          public-key-location: classpath:jwt_pub.key
-secure:
-  ignore:
-    urls: # 配置白名单路径
-      - "/doc.html"
-      - "/code"
-      - "/swagger-resources/**"
-      - "/swagger/**"
-      - "/*/v2/api-docs"
-      - "/*/*.js"
-      - "/*/*/*.js"
-      - "/*/*.css"
-      - "/*/*/*.css"
-      - "/*/*.png"
-      - "/*/*/*.png"
-      - "/*.ico"
-      - "/*/*.ico"
-      - "/*/*/*.ico"
-      - "/webjars/springfox-swagger-ui/**"
-      - "/actuator/**"
-logging:
-  level:
-    root: info
-management:
-  metrics:
-    tags:
-      application: ${spring.application.name}
-
-