From f66ff5c8f8e12da1a0720b3eb9ff8d14cc0ef118 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=BF=94?= Date: Wed, 3 Jun 2026 11:21:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(auth):=20JwtTokenProvider=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=20userType=20=E5=AD=97=E6=AE=B5=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=20ADMIN/MEMBER=20=E5=8C=BA=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增四参数 generateToken 方法,支持传入 userType - 旧方法默认 userType=ADMIN,保持向后兼容 - 新增 getUserTypeFromToken 方法解析 Token 中的 userType - 补充 userType 相关单元测试 --- .../manage/sys/security/JwtTokenProvider.java | 21 ++++---- .../sys/security/JwtTokenProviderTest.java | 48 +++++++++++++++++++ 2 files changed, 58 insertions(+), 11 deletions(-) diff --git a/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/security/JwtTokenProvider.java b/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/security/JwtTokenProvider.java index 9035036..1a003b5 100644 --- a/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/security/JwtTokenProvider.java +++ b/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/security/JwtTokenProvider.java @@ -32,24 +32,19 @@ public class JwtTokenProvider { } public String generateToken(String username, Long userId) { - Map claims = new HashMap<>(); - claims.put("userId", userId); - claims.put("username", username); - - return Jwts.builder() - .setClaims(claims) - .setSubject(username) - .setIssuedAt(new Date()) - .setExpiration(new Date(System.currentTimeMillis() + jwtProperties.getExpiration())) - .signWith(getSigningKey()) - .compact(); + return generateToken(username, userId, java.util.Collections.emptyList(), "ADMIN"); } public String generateToken(String username, Long userId, java.util.List roles) { + return generateToken(username, userId, roles, "ADMIN"); + } + + public String generateToken(String username, Long userId, java.util.List roles, String userType) { Map claims = new HashMap<>(); claims.put("userId", userId); claims.put("username", username); claims.put("roles", roles); + claims.put("userType", userType); return Jwts.builder() .setClaims(claims) @@ -85,6 +80,10 @@ public class JwtTokenProvider { return java.util.Collections.emptyList(); } + public String getUserTypeFromToken(String token) { + return getClaimsFromToken(token).get("userType", String.class); + } + public boolean validateToken(String token) { try { getClaimsFromToken(token); diff --git a/gym-manage-api/manage-sys/src/test/java/cn/novalon/gym/manage/sys/security/JwtTokenProviderTest.java b/gym-manage-api/manage-sys/src/test/java/cn/novalon/gym/manage/sys/security/JwtTokenProviderTest.java index 33371ae..548badf 100644 --- a/gym-manage-api/manage-sys/src/test/java/cn/novalon/gym/manage/sys/security/JwtTokenProviderTest.java +++ b/gym-manage-api/manage-sys/src/test/java/cn/novalon/gym/manage/sys/security/JwtTokenProviderTest.java @@ -108,4 +108,52 @@ class JwtTokenProviderTest { assertThat(isValid).isFalse(); } + + @Test + void testGenerateTokenWithUserType() { + when(jwtProperties.getSecret()).thenReturn("test-secret-key-for-testing-purposes-only-1234567890"); + when(jwtProperties.getExpiration()).thenReturn(3600000L); + + String token = jwtTokenProvider.generateToken("testuser", 1L, java.util.List.of("admin"), "ADMIN"); + + assertThat(token).isNotNull(); + assertThat(token).isNotEmpty(); + } + + @Test + void testGetUserTypeFromToken() { + when(jwtProperties.getSecret()).thenReturn("test-secret-key-for-testing-purposes-only-1234567890"); + when(jwtProperties.getExpiration()).thenReturn(3600000L); + + String token = jwtTokenProvider.generateToken("testuser", 1L, java.util.List.of("admin"), "ADMIN"); + + String userType = jwtTokenProvider.getUserTypeFromToken(token); + + assertThat(userType).isEqualTo("ADMIN"); + } + + @Test + void testGetUserTypeFromToken_Member() { + when(jwtProperties.getSecret()).thenReturn("test-secret-key-for-testing-purposes-only-1234567890"); + when(jwtProperties.getExpiration()).thenReturn(3600000L); + + String token = jwtTokenProvider.generateToken("123", 123L, java.util.List.of(), "MEMBER"); + + String userType = jwtTokenProvider.getUserTypeFromToken(token); + + assertThat(userType).isEqualTo("MEMBER"); + } + + @Test + void testGetUserTypeFromToken_DefaultIsAdmin() { + when(jwtProperties.getSecret()).thenReturn("test-secret-key-for-testing-purposes-only-1234567890"); + when(jwtProperties.getExpiration()).thenReturn(3600000L); + + // 使用旧的两参数方法生成的 token 默认 userType 为 ADMIN + String token = jwtTokenProvider.generateToken("testuser", 1L); + + String userType = jwtTokenProvider.getUserTypeFromToken(token); + + assertThat(userType).isEqualTo("ADMIN"); + } } \ No newline at end of file