完成登录功能

This commit is contained in:
future
2026-06-24 22:28:03 +08:00
parent 972cbf1e56
commit c44478a9cb
24 changed files with 416 additions and 393 deletions
@@ -0,0 +1,19 @@
package cn.novalon.gym.manage.common.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "auth")
public class AuthConfig {
private String accessKeyId;
private String accessKeySecret;
private Integer tokenExpireSeconds = 86400;
private Integer refreshTokenExpireSeconds = 604800;
}
@@ -0,0 +1,54 @@
package cn.novalon.gym.manage.common.response;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {
private Integer code;
private String message;
private T data;
private Long timestamp;
public static <T> Result<T> success(T data) {
return Result.<T>builder()
.code(200)
.message("success")
.data(data)
.timestamp(System.currentTimeMillis())
.build();
}
public static <T> Result<T> success(String message) {
return Result.<T>builder()
.code(200)
.message(message)
.timestamp(System.currentTimeMillis())
.build();
}
public static <T> Result<T> fail(Integer code, String message) {
return Result.<T>builder()
.code(code)
.message(message)
.timestamp(System.currentTimeMillis())
.build();
}
public static <T> Result<T> fail(String message) {
return Result.<T>builder()
.code(500)
.message(message)
.timestamp(System.currentTimeMillis())
.build();
}
}
@@ -0,0 +1,86 @@
package cn.novalon.gym.manage.common.util;
import cn.novalon.gym.manage.common.config.JwtProperties;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@Component
@RequiredArgsConstructor
public class JwtUtil {
private final JwtProperties jwtProperties;
private SecretKey getSigningKey() {
String secret = jwtProperties.getSecret();
if (secret.length() < 32) {
StringBuilder sb = new StringBuilder(secret);
while (sb.length() < 32) {
sb.append(secret);
}
secret = sb.substring(0, 32);
}
return Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8));
}
public String generateToken(String userId, String phone) {
Date now = new Date();
Date expiryDate = new Date(now.getTime() + jwtProperties.getExpiration());
Map<String, Object> claims = new HashMap<>();
claims.put("userId", userId);
claims.put("phone", phone);
return Jwts.builder()
.setClaims(claims)
.setSubject(userId)
.setIssuedAt(now)
.setExpiration(expiryDate)
.signWith(getSigningKey())
.compact();
}
public String generateRefreshToken(String userId) {
Date now = new Date();
Date expiryDate = new Date(now.getTime() + jwtProperties.getExpiration() * 7);
return Jwts.builder()
.setSubject(userId)
.setIssuedAt(now)
.setExpiration(expiryDate)
.signWith(getSigningKey())
.compact();
}
public Claims parseToken(String token) {
return Jwts.parserBuilder()
.setSigningKey(getSigningKey())
.build()
.parseClaimsJws(token)
.getBody();
}
public String getUserIdFromToken(String token) {
return parseToken(token).getSubject();
}
public boolean validateToken(String token) {
try {
parseToken(token);
return true;
} catch (Exception e) {
log.warn("JWT token validation failed: {}", e.getMessage());
return false;
}
}
}