From b9ee154a7b3cea6a099316f9c9be08a8a9f28093 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?OK=E4=BA=86?= <2634608480@qq.com> Date: Fri, 12 Sep 2025 16:28:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=BA=AFjava=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E5=AE=9E=E7=8E=B0=E7=9A=84jwt=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E5=B8=A6lombok=EF=BC=8C=E5=BC=95=E5=85=A5=E4=BC=9A=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E7=89=88=E6=9C=AC=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/UserLoginService.java | 21 ++--- .../src/main/resources/application.properties | 5 ++ user-service/user-service-common/pom.xml | 18 +++++ .../example/user/service/common/JwtUtil.java | 79 +++++++++++++++++++ .../user/service/common/config/JwtConfig.java | 29 +++++++ 5 files changed, 142 insertions(+), 10 deletions(-) create mode 100644 user-service/user-service-common/src/main/java/com/example/user/service/common/JwtUtil.java create mode 100644 user-service/user-service-common/src/main/java/com/example/user/service/common/config/JwtConfig.java diff --git a/user-service/user-service-application/src/main/java/com/example/user/service/application/service/UserLoginService.java b/user-service/user-service-application/src/main/java/com/example/user/service/application/service/UserLoginService.java index 4240269..9187d83 100644 --- a/user-service/user-service-application/src/main/java/com/example/user/service/application/service/UserLoginService.java +++ b/user-service/user-service-application/src/main/java/com/example/user/service/application/service/UserLoginService.java @@ -1,9 +1,11 @@ +// user-service-application/src/main/java/com/example/user/application/service/UserLoginService.java package com.example.user.service.application.service; import com.example.user.service.application.command.UserLoginCommand; import com.example.user.service.application.port.in.UserLoginUseCase; import com.example.user.service.domain.User; import com.example.user.service.domain.port.GetUserByNamePort; +import com.example.user.service.common.JwtUtil; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -15,23 +17,22 @@ public class UserLoginService implements UserLoginUseCase { @Resource private GetUserByNamePort getUserByNamePort; + @Resource + private JwtUtil jwtUtil; + @Override public String login(UserLoginCommand userLoginCommand) { - //验证用户 User user = User.getUserByName(userLoginCommand.name(), getUserByNamePort); log.info("user:{}", user); - if(user==null){ + if(user == null){ throw new RuntimeException("用户不存在"); } - //验证密码 if(!user.validatePassword(userLoginCommand.password())){ throw new RuntimeException("密码错误"); } - //签发token - /* - todo 封装一个JwtUtil实现jwt签发 - token 有效期 5min ,key=123456 ,载荷:{name:user.name,id:user.id,is_super} - */ - return "token"; + return jwtUtil.generateToken( + user.getName().getValue(), + user.getId().getValue()); + } -} +} \ No newline at end of file diff --git a/user-service/user-service-bootstrap/src/main/resources/application.properties b/user-service/user-service-bootstrap/src/main/resources/application.properties index e21f2d5..ef6c11a 100644 --- a/user-service/user-service-bootstrap/src/main/resources/application.properties +++ b/user-service/user-service-bootstrap/src/main/resources/application.properties @@ -22,3 +22,8 @@ spring.cloud.nacos.config.server-addr=192.168.168.128:8848 # spring.cloud.nacos.config.namespace= spring.config.import=nacos:${spring.application.name}.properties?refresh=true +#jwt +# ????????????? +jwt.secret=6f4b4d7a9c2e1b8f3a5d6e7c8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b +jwt.expiration= 300000 + # 5min= 300000 \ No newline at end of file diff --git a/user-service/user-service-common/pom.xml b/user-service/user-service-common/pom.xml index a198ef3..f5b652b 100644 --- a/user-service/user-service-common/pom.xml +++ b/user-service/user-service-common/pom.xml @@ -24,6 +24,24 @@ spring-boot-starter-test test + + + io.jsonwebtoken + jjwt-api + 0.11.5 + + + io.jsonwebtoken + jjwt-impl + 0.11.5 + runtime + + + io.jsonwebtoken + jjwt-jackson + 0.11.5 + runtime + diff --git a/user-service/user-service-common/src/main/java/com/example/user/service/common/JwtUtil.java b/user-service/user-service-common/src/main/java/com/example/user/service/common/JwtUtil.java new file mode 100644 index 0000000..dfe88a2 --- /dev/null +++ b/user-service/user-service-common/src/main/java/com/example/user/service/common/JwtUtil.java @@ -0,0 +1,79 @@ +// JwtUtil.java - 完全不依赖Lombok +package com.example.user.service.common; + +import com.example.user.service.common.config.JwtConfig; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.security.Keys; +import org.springframework.stereotype.Component; + +import javax.crypto.SecretKey; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +@Component +public class JwtUtil { + + private final JwtConfig jwtConfig; + + // 通过构造函数注入配置 + public JwtUtil(JwtConfig jwtConfig) { + this.jwtConfig = jwtConfig; + } + + public String generateToken(String username, Long userId) { + SecretKey key = Keys.hmacShaKeyFor(jwtConfig.getSecret().getBytes()); + + Map claims = new HashMap<>(); + claims.put("name", username); + claims.put("id", userId); + + return Jwts.builder() + .setClaims(claims) + .setSubject(username) + .setIssuedAt(new Date()) + .setExpiration(new Date(System.currentTimeMillis() + jwtConfig.getExpiration())) + .signWith(key, SignatureAlgorithm.HS256) + .compact(); + } + + // 其他方法保持不变... + public boolean validateToken(String token) { + try { + SecretKey key = Keys.hmacShaKeyFor(jwtConfig.getSecret().getBytes()); + Jwts.parserBuilder() + .setSigningKey(key) + .build() + .parseClaimsJws(token); + return true; + } catch (Exception e) { + return false; + } + } + + public String getUsernameFromToken(String token) { + Claims claims = getClaimsFromToken(token); + return claims.getSubject(); + } + + public Long getUserIdFromToken(String token) { + Claims claims = getClaimsFromToken(token); + return claims.get("id", Long.class); + } + + public Boolean getIsSuperFromToken(String token) { + Claims claims = getClaimsFromToken(token); + return claims.get("is_super", Boolean.class); + } + + private Claims getClaimsFromToken(String token) { + SecretKey key = Keys.hmacShaKeyFor(jwtConfig.getSecret().getBytes()); + return Jwts.parserBuilder() + .setSigningKey(key) + .build() + .parseClaimsJws(token) + .getBody(); + } +} \ No newline at end of file diff --git a/user-service/user-service-common/src/main/java/com/example/user/service/common/config/JwtConfig.java b/user-service/user-service-common/src/main/java/com/example/user/service/common/config/JwtConfig.java new file mode 100644 index 0000000..5abf081 --- /dev/null +++ b/user-service/user-service-common/src/main/java/com/example/user/service/common/config/JwtConfig.java @@ -0,0 +1,29 @@ +// JwtConfig.java - 手动实现getter/setter +package com.example.user.service.common.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties(prefix = "jwt") +public class JwtConfig { + private String secret; + private long expiration; + + // 手动实现getter和setter + public String getSecret() { + return secret; + } + + public void setSecret(String secret) { + this.secret = secret; + } + + public long getExpiration() { + return expiration; + } + + public void setExpiration(long expiration) { + this.expiration = expiration; + } +} \ No newline at end of file -- Gitee