feat(security): 更新 JWT 密钥并改进加密方式

- 更新 JWT 密钥为一个足够长的 Base64 编码密钥,满足 HS512 的要求
- 修改 JwtTokenUtil 类,使用 Keys.hmacShaKeyFor 生成密钥
- 优化 token 解析和生成过程,使用 parserBuilder 设置密钥

refactor(category): 重构分类组件并优化分类选择逻辑

- 移除原有的分类层级结构,改为使用树形结构
- 优化分类选择界面,使用级联选择器- 重构分类相关的数据结构和方法,提高可维护性

fix(application.yml): 优化配置文件格式

- 更新 JWT 密钥配置,确保密钥长度符合要求
This commit is contained in:
2025-07-31 11:15:34 +08:00
parent e246a8edfd
commit a5c3ca482f
4 changed files with 125 additions and 143 deletions

View File

@@ -3,10 +3,14 @@ package com.test.bijihoudaun.util;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@@ -21,6 +25,13 @@ public class JwtTokenUtil {
@Value("${jwt.expiration}")
private Long expiration;
private Key key;
@PostConstruct
public void init() {
this.key = Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8));
}
// 从token中获取用户名
public String getUsernameFromToken(String token) {
return getClaimFromToken(token, Claims::getSubject);
@@ -38,7 +49,7 @@ public class JwtTokenUtil {
// 为了从token中获取任何信息我们都需要密钥
private Claims getAllClaimsFromToken(String token) {
return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
return Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();
}
// 检查token是否过期
@@ -57,7 +68,7 @@ public class JwtTokenUtil {
private String doGenerateToken(Map<String, Object> claims, String subject) {
return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + expiration * 1000))
.signWith(SignatureAlgorithm.HS512, secret).compact();
.signWith(key, SignatureAlgorithm.HS512).compact();
}
// 验证token

View File

@@ -32,7 +32,7 @@ mybatis-plus:
# JWT 配置
jwt:
secret: mysecretkeymysecretkeymysecretkeymysecretkeymysecretkey # 至少256位的密钥
secret: V2VsbCwgSSBzdXBwb3NlIHRoYXQgaWYgeW91J3JlIHJlYWRpbmcgdGhpcywgeW91J3JlIHByZXR0eSBjdXJpb3VzLg== # 这是一个足够长的Base64编码密钥满足HS512的要求
expiration: 86400 # token有效期单位秒这里是24小时
header: Authorization # JWT存储的请求头
tokenHead: "Bearer " # JWT负载中拿到开头