feat(auth): JwtTokenProvider 增加 userType 字段,支持 ADMIN/MEMBER 区分

- 新增四参数 generateToken 方法,支持传入 userType
- 旧方法默认 userType=ADMIN,保持向后兼容
- 新增 getUserTypeFromToken 方法解析 Token 中的 userType
- 补充 userType 相关单元测试
This commit is contained in:
张翔
2026-06-03 11:21:20 +08:00
parent 005c09c99c
commit f66ff5c8f8
2 changed files with 58 additions and 11 deletions
@@ -32,24 +32,19 @@ public class JwtTokenProvider {
} }
public String generateToken(String username, Long userId) { public String generateToken(String username, Long userId) {
Map<String, Object> claims = new HashMap<>(); return generateToken(username, userId, java.util.Collections.emptyList(), "ADMIN");
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();
} }
public String generateToken(String username, Long userId, java.util.List<String> roles) { public String generateToken(String username, Long userId, java.util.List<String> roles) {
return generateToken(username, userId, roles, "ADMIN");
}
public String generateToken(String username, Long userId, java.util.List<String> roles, String userType) {
Map<String, Object> claims = new HashMap<>(); Map<String, Object> claims = new HashMap<>();
claims.put("userId", userId); claims.put("userId", userId);
claims.put("username", username); claims.put("username", username);
claims.put("roles", roles); claims.put("roles", roles);
claims.put("userType", userType);
return Jwts.builder() return Jwts.builder()
.setClaims(claims) .setClaims(claims)
@@ -85,6 +80,10 @@ public class JwtTokenProvider {
return java.util.Collections.emptyList(); return java.util.Collections.emptyList();
} }
public String getUserTypeFromToken(String token) {
return getClaimsFromToken(token).get("userType", String.class);
}
public boolean validateToken(String token) { public boolean validateToken(String token) {
try { try {
getClaimsFromToken(token); getClaimsFromToken(token);
@@ -108,4 +108,52 @@ class JwtTokenProviderTest {
assertThat(isValid).isFalse(); 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");
}
} }