修正项目结构
This commit is contained in:
@@ -1,33 +0,0 @@
|
|||||||
package com.caiji.uls;
|
|
||||||
|
|
||||||
import com.caiji.uls.utils.jwt.RsaKeyGenerator;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 密钥生成测试类
|
|
||||||
*/
|
|
||||||
public class KeyGenTest {
|
|
||||||
public static void main(String[] args) {
|
|
||||||
try {
|
|
||||||
System.out.println("=== 生成RSA密钥对 ===\n");
|
|
||||||
|
|
||||||
var keyPair = RsaKeyGenerator.generateKeyPair();
|
|
||||||
var publicKey = (java.security.interfaces.RSAPublicKey) keyPair.getPublic();
|
|
||||||
var privateKey = (java.security.interfaces.RSAPrivateKey) keyPair.getPrivate();
|
|
||||||
|
|
||||||
String encodedPublicKey = RsaKeyGenerator.encodePublicKey(publicKey);
|
|
||||||
String encodedPrivateKey = RsaKeyGenerator.encodePrivateKey(privateKey);
|
|
||||||
|
|
||||||
System.out.println("公钥 (Public Key):");
|
|
||||||
System.out.println(encodedPublicKey);
|
|
||||||
System.out.println("\n私钥 (Private Key):");
|
|
||||||
System.out.println(encodedPrivateKey);
|
|
||||||
System.out.println("\n=== 请将以上密钥配置到 application.properties ===");
|
|
||||||
System.out.println("jwt.public-key=" + encodedPublicKey);
|
|
||||||
System.out.println("jwt.private-key=" + encodedPrivateKey);
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
System.err.println("生成密钥对失败: " + e.getMessage());
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
package com.caiji.uls;
|
|
||||||
|
|
||||||
import com.caiji.uls.entity.User;
|
|
||||||
import com.caiji.uls.service.UserService;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
|
||||||
|
|
||||||
@SpringBootTest
|
|
||||||
class UniLoginSystemApplicationTests {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private UserService userService;
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void contextLoads() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testRegisterAndInitUser() {
|
|
||||||
// 测试注册和初始化用户信息
|
|
||||||
User user = userService.register("testuser", "password123");
|
|
||||||
System.out.println("注册用户ID: " + user.getId());
|
|
||||||
System.out.println("用户信息ID: " + user.getUserInfoTid());
|
|
||||||
|
|
||||||
// 验证 userInfoTid 不为空
|
|
||||||
assert user.getUserInfoTid() != null;
|
|
||||||
assert user.getUserInfoTid() > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,181 +0,0 @@
|
|||||||
package com.caiji.uls.utils.jwt;
|
|
||||||
|
|
||||||
import org.junit.jupiter.api.BeforeAll;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import java.security.KeyPair;
|
|
||||||
import java.security.interfaces.RSAPrivateKey;
|
|
||||||
import java.security.interfaces.RSAPublicKey;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 企业级JWT功能测试
|
|
||||||
*/
|
|
||||||
public class EnterpriseJwtTest {
|
|
||||||
|
|
||||||
private static String testPublicKey;
|
|
||||||
private static String testPrivateKey;
|
|
||||||
|
|
||||||
@BeforeAll
|
|
||||||
public static void setUp() throws Exception {
|
|
||||||
// 生成测试密钥对
|
|
||||||
KeyPair keyPair = RsaKeyGenerator.generateKeyPair();
|
|
||||||
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
|
|
||||||
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
|
|
||||||
|
|
||||||
testPublicKey = RsaKeyGenerator.encodePublicKey(publicKey);
|
|
||||||
testPrivateKey = RsaKeyGenerator.encodePrivateKey(privateKey);
|
|
||||||
|
|
||||||
// 初始化密钥管理器
|
|
||||||
JwtKeyManager.initKeys(testPublicKey, testPrivateKey);
|
|
||||||
|
|
||||||
System.out.println("✅ 测试环境初始化完成");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testGenerateAndValidateToken() {
|
|
||||||
System.out.println("\n=== 测试1: 生成和验证Token ===");
|
|
||||||
|
|
||||||
// 生成Token
|
|
||||||
String token = JwtUtil.generateToken("user123", "testuser");
|
|
||||||
assertNotNull(token, "Token不应为null");
|
|
||||||
assertTrue(token.split("\\.").length == 3, "Token应为三段式结构");
|
|
||||||
|
|
||||||
System.out.println("生成的Token: " + token.substring(0, 50) + "...");
|
|
||||||
|
|
||||||
// 验证Token
|
|
||||||
assertTrue(JwtUtil.validateToken(token), "Token应有效");
|
|
||||||
assertEquals("user123", JwtUtil.getUserIdFromToken(token), "用户ID应匹配");
|
|
||||||
assertEquals("testuser", JwtUtil.getUsernameFromToken(token), "用户名应匹配");
|
|
||||||
|
|
||||||
System.out.println("✅ Token生成和验证成功");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testEnhancedClaims() {
|
|
||||||
System.out.println("\n=== 测试2: 增强Claims字段 ===");
|
|
||||||
|
|
||||||
String token = JwtUtil.generateToken("user456", "admin");
|
|
||||||
var claims = JwtUtil.getClaimsFromToken(token);
|
|
||||||
|
|
||||||
// 验证标准字段
|
|
||||||
assertNotNull(claims.getId(), "JTI不应为null");
|
|
||||||
assertEquals("uni-login-system", claims.getIssuer(), "签发者应匹配");
|
|
||||||
assertNotNull(claims.getIssuedAt(), "签发时间不应为null");
|
|
||||||
assertNotNull(claims.getExpiration(), "过期时间不应为null");
|
|
||||||
assertNotNull(claims.getNotBefore(), "生效时间不应为null");
|
|
||||||
|
|
||||||
// 验证自定义字段
|
|
||||||
assertEquals("user456", claims.get("userId", String.class), "用户ID应匹配");
|
|
||||||
|
|
||||||
System.out.println("JTI: " + claims.getId());
|
|
||||||
System.out.println("ISS: " + claims.getIssuer());
|
|
||||||
System.out.println("✅ 增强Claims验证成功");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testTokenWithExtraClaims() {
|
|
||||||
System.out.println("\n=== 测试3: 带额外声明的Token ===");
|
|
||||||
|
|
||||||
Map<String, Object> extraClaims = new HashMap<>();
|
|
||||||
extraClaims.put("role", "admin");
|
|
||||||
extraClaims.put("department", "IT");
|
|
||||||
|
|
||||||
String token = JwtUtil.generateToken("user789", "manager", extraClaims);
|
|
||||||
var claims = JwtUtil.getClaimsFromToken(token);
|
|
||||||
|
|
||||||
assertEquals("admin", claims.get("role", String.class), "角色应匹配");
|
|
||||||
assertEquals("IT", claims.get("department", String.class), "部门应匹配");
|
|
||||||
|
|
||||||
System.out.println("Role: " + claims.get("role", String.class));
|
|
||||||
System.out.println("Department: " + claims.get("department", String.class));
|
|
||||||
System.out.println("✅ 额外声明添加成功");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testTokenExpiration() {
|
|
||||||
System.out.println("\n=== 测试4: Token过期检查 ===");
|
|
||||||
|
|
||||||
String token = JwtUtil.generateToken("user999", "tempuser");
|
|
||||||
|
|
||||||
// 检查剩余时间
|
|
||||||
long remainingTime = JwtUtil.getTokenRemainingTime(token);
|
|
||||||
assertTrue(remainingTime > 0, "剩余时间应大于0");
|
|
||||||
|
|
||||||
System.out.println("剩余有效期: " + (remainingTime / 3600) + " 小时");
|
|
||||||
assertFalse(JwtUtil.isTokenExpired(token), "Token不应过期");
|
|
||||||
|
|
||||||
System.out.println("✅ 过期检查成功");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testTokenRefresh() {
|
|
||||||
System.out.println("\n=== 测试5: Token刷新 ===");
|
|
||||||
|
|
||||||
String originalToken = JwtUtil.generateToken("user111", "refreshuser");
|
|
||||||
String userId1 = JwtUtil.getUserIdFromToken(originalToken);
|
|
||||||
|
|
||||||
// 刷新Token
|
|
||||||
String newToken = JwtUtil.refreshToken(originalToken);
|
|
||||||
assertNotNull(newToken, "新Token不应为null");
|
|
||||||
assertNotEquals(originalToken, newToken, "新旧Token应不同");
|
|
||||||
|
|
||||||
// 验证新Token
|
|
||||||
String userId2 = JwtUtil.getUserIdFromToken(newToken);
|
|
||||||
assertEquals(userId1, userId2, "用户ID应保持一致");
|
|
||||||
|
|
||||||
System.out.println("原Token JTI: " + JwtUtil.getJtiFromToken(originalToken));
|
|
||||||
System.out.println("新Token JTI: " + JwtUtil.getJtiFromToken(newToken));
|
|
||||||
System.out.println("✅ Token刷新成功");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testInvalidToken() {
|
|
||||||
System.out.println("\n=== 测试6: 无效Token处理 ===");
|
|
||||||
|
|
||||||
// 测试格式错误的Token
|
|
||||||
assertFalse(JwtUtil.validateToken("invalid.token.here"), "无效Token应验证失败");
|
|
||||||
|
|
||||||
// 测试空Token
|
|
||||||
assertFalse(JwtUtil.validateToken(""), "空Token应验证失败");
|
|
||||||
|
|
||||||
// 测试篡改的Token
|
|
||||||
String validToken = JwtUtil.generateToken("user222", "test");
|
|
||||||
String tamperedToken = validToken.substring(0, 20) + "X" + validToken.substring(21);
|
|
||||||
assertFalse(JwtUtil.validateToken(tamperedToken), "篡改Token应验证失败");
|
|
||||||
|
|
||||||
System.out.println("✅ 无效Token处理正确");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testKeyRotation() throws Exception {
|
|
||||||
System.out.println("\n=== 测试7: 密钥轮换 ===");
|
|
||||||
|
|
||||||
// 生成旧Token
|
|
||||||
String oldToken = JwtUtil.generateToken("user333", "rotationtest");
|
|
||||||
assertTrue(JwtUtil.validateToken(oldToken), "旧Token应有效");
|
|
||||||
|
|
||||||
// 生成新密钥对并轮换
|
|
||||||
KeyPair newKeyPair = RsaKeyGenerator.generateKeyPair();
|
|
||||||
String newPublicKey = RsaKeyGenerator.encodePublicKey((RSAPublicKey) newKeyPair.getPublic());
|
|
||||||
String newPrivateKey = RsaKeyGenerator.encodePrivateKey((RSAPrivateKey) newKeyPair.getPrivate());
|
|
||||||
|
|
||||||
JwtKeyManager.rotateKeys(newPublicKey, newPrivateKey);
|
|
||||||
|
|
||||||
// 旧Token仍应有效(使用旧公钥验证)
|
|
||||||
assertTrue(JwtUtil.validateToken(oldToken), "旧Token在轮换后仍应有效");
|
|
||||||
|
|
||||||
// 生成新Token
|
|
||||||
String newToken = JwtUtil.generateToken("user333", "rotationtest");
|
|
||||||
assertTrue(JwtUtil.validateToken(newToken), "新Token应有效");
|
|
||||||
|
|
||||||
System.out.println("✅ 密钥轮换成功,新旧Token均有效");
|
|
||||||
|
|
||||||
// 清除旧密钥
|
|
||||||
JwtKeyManager.clearPreviousKey();
|
|
||||||
System.out.println("✅ 旧密钥已清除");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user