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