diff --git a/Dockerfile b/Dockerfile index 8fa3eb2..8461a71 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,7 +14,7 @@ FROM eclipse-temurin:17-jre-alpine WORKDIR /app # 复制部署结构:bin/ libs/ etc/ -COPY --from=builder /app/src/main/scripts/start.sh bin/start.sh +COPY --from=builder /app/scripts/start.sh bin/start.sh COPY --from=builder /app/target/libs/ libs/ COPY --from=builder /app/src/main/resources/application.yml etc/application.yml COPY --from=builder /app/src/main/resources/logback.xml etc/logback.xml diff --git a/src/main/assembly/distribution.xml b/assembly/distribution.xml similarity index 92% rename from src/main/assembly/distribution.xml rename to assembly/distribution.xml index 2ef0a62..6df86d7 100644 --- a/src/main/assembly/distribution.xml +++ b/assembly/distribution.xml @@ -12,7 +12,7 @@ - src/main/scripts/start.sh + scripts/start.sh bin 0755 @@ -40,7 +40,7 @@ - src/main/assembly/empty-logs + assembly/empty-logs logs diff --git a/src/main/assembly/empty-logs/.gitkeep b/assembly/empty-logs/.gitkeep similarity index 100% rename from src/main/assembly/empty-logs/.gitkeep rename to assembly/empty-logs/.gitkeep diff --git a/docker-compose.yml b/docker-compose.yml index 823bb22..35345fc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ services: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data - - ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql + - ./src/main/resources/sql/init.sql:/docker-entrypoint-initdb.d/init.sql healthcheck: test: ["CMD-SHELL", "pg_isready -U label -d label_db"] interval: 10s diff --git a/pom.xml b/pom.xml index 5180e89..4a02d56 100644 --- a/pom.xml +++ b/pom.xml @@ -132,6 +132,14 @@ + + + src/main/resources + + sql/** + + + @@ -178,7 +186,7 @@ - src/main/assembly/distribution.xml + assembly/distribution.xml ${project.artifactId}-${project.version} false @@ -188,4 +196,4 @@ - \ No newline at end of file + diff --git a/src/main/scripts/start.sh b/scripts/start.sh similarity index 100% rename from src/main/scripts/start.sh rename to scripts/start.sh diff --git a/src/main/java/com/label/common/context/UserContext.java b/src/main/java/com/label/common/context/UserContext.java deleted file mode 100644 index 466a1ef..0000000 --- a/src/main/java/com/label/common/context/UserContext.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.label.common.context; - -import com.label.common.auth.TokenPrincipal; - -public final class UserContext { - private static final ThreadLocal PRINCIPAL = new ThreadLocal<>(); - - public static void set(TokenPrincipal principal) { - PRINCIPAL.set(principal); - } - - public static TokenPrincipal get() { - return PRINCIPAL.get(); - } - - public static void clear() { - PRINCIPAL.remove(); - } - - private UserContext() { - throw new UnsupportedOperationException("Utility class"); - } -} diff --git a/src/main/java/com/label/interceptor/AuthInterceptor.java b/src/main/java/com/label/interceptor/AuthInterceptor.java index fa18903..aec3d43 100644 --- a/src/main/java/com/label/interceptor/AuthInterceptor.java +++ b/src/main/java/com/label/interceptor/AuthInterceptor.java @@ -14,7 +14,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.label.annotation.RequireRole; import com.label.common.auth.TokenPrincipal; import com.label.common.context.CompanyContext; -import com.label.common.context.UserContext; import com.label.common.result.Result; import com.label.service.RedisService; import com.label.util.RedisUtil; @@ -79,7 +78,6 @@ public class AuthInterceptor implements HandlerInterceptor { @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { - UserContext.clear(); CompanyContext.clear(); } @@ -125,7 +123,6 @@ public class AuthInterceptor implements HandlerInterceptor { private void bindPrincipal(HttpServletRequest request, TokenPrincipal principal) { CompanyContext.set(principal.getCompanyId()); - UserContext.set(principal); request.setAttribute("__token_principal__", principal); } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index eaae6e4..4a781ca 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -5,9 +5,9 @@ spring: application: name: label-backend datasource: - url: ${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/labeldb} + url: ${SPRING_DATASOURCE_URL:jdbc:postgresql://39.107.112.174:5432/labeldb} username: ${SPRING_DATASOURCE_USERNAME:postgres} - password: ${SPRING_DATASOURCE_PASSWORD:} + password: ${SPRING_DATASOURCE_PASSWORD:postgres!Pw} driver-class-name: org.postgresql.Driver hikari: maximum-pool-size: 20 @@ -16,9 +16,9 @@ spring: data: redis: - host: ${SPRING_DATA_REDIS_HOST:localhost} + host: ${SPRING_DATA_REDIS_HOST:39.107.112.174} port: ${SPRING_DATA_REDIS_PORT:6379} - password: ${SPRING_DATA_REDIS_PASSWORD:} + password: ${SPRING_DATA_REDIS_PASSWORD:jsti@2024} timeout: 5000ms lettuce: pool: @@ -54,9 +54,9 @@ mybatis-plus: id-type: auto rustfs: - endpoint: ${RUSTFS_ENDPOINT:http://localhost:9000} + endpoint: ${RUSTFS_ENDPOINT:http://39.107.112.174:9000} access-key: ${RUSTFS_ACCESS_KEY:admin} - secret-key: ${RUSTFS_SECRET_KEY:local-secret-key} + secret-key: ${RUSTFS_SECRET_KEY:your_strong_password} region: us-east-1 ai-service: @@ -64,7 +64,7 @@ ai-service: timeout: 30000 auth: - enabled: true + enabled: false mock-company-id: 1 mock-user-id: 1 mock-role: ADMIN diff --git a/sql/init.sql b/src/main/resources/sql/init.sql similarity index 100% rename from sql/init.sql rename to src/main/resources/sql/init.sql diff --git a/src/test/java/com/label/unit/AuthInterceptorTest.java b/src/test/java/com/label/unit/AuthInterceptorTest.java index 37b7df5..932dca7 100644 --- a/src/test/java/com/label/unit/AuthInterceptorTest.java +++ b/src/test/java/com/label/unit/AuthInterceptorTest.java @@ -5,7 +5,6 @@ import com.label.annotation.RequireAuth; import com.label.annotation.RequireRole; import com.label.common.auth.TokenPrincipal; import com.label.common.context.CompanyContext; -import com.label.common.context.UserContext; import com.label.interceptor.AuthInterceptor; import com.label.service.RedisService; import com.label.util.RedisUtil; @@ -22,6 +21,7 @@ import java.lang.reflect.Method; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -36,7 +36,6 @@ class AuthInterceptorTest { @AfterEach void tearDown() { CompanyContext.clear(); - UserContext.clear(); } @Test @@ -62,7 +61,6 @@ class AuthInterceptorTest { assertThat(principal.getUserId()).isEqualTo(10L); assertThat(principal.getRole()).isEqualTo("ADMIN"); assertThat(CompanyContext.get()).isEqualTo(20L); - assertThat(UserContext.get()).isSameAs(principal); verify(redisService).expire(RedisUtil.tokenKey("valid-token"), 7200L); verify(redisService).expire(RedisUtil.userSessionsKey(10L), 7200L); } @@ -118,16 +116,21 @@ class AuthInterceptorTest { } @Test - @DisplayName("请求完成后清理用户和公司 ThreadLocal") - void afterCompletionClearsContexts() throws Exception { + @DisplayName("UserContext 已被移除,避免重复维护用户 ThreadLocal") + void userContextClassShouldBeRemoved() { + assertThatThrownBy(() -> Class.forName("com.label.common.context.UserContext")) + .isInstanceOf(ClassNotFoundException.class); + } + + @Test + @DisplayName("请求完成后清理公司 ThreadLocal") + void afterCompletionClearsCompanyContext() throws Exception { CompanyContext.set(20L); - UserContext.set(new TokenPrincipal(10L, "ADMIN", 20L, "admin", "token")); interceptor.afterCompletion(new MockHttpServletRequest(), new MockHttpServletResponse(), handler("adminOnly"), null); assertThat(CompanyContext.get()).isEqualTo(-1L); - assertThat(UserContext.get()).isNull(); } private static HandlerMethod handler(String methodName) throws NoSuchMethodException {