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 42402695584795cd646ce7f6a299db36bd7700d4..9187d83c89d8d701ffb6be57fadb1f412ed2bd2c 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 e21f2d53a0095bf9cb21dd0512b3d9844ce3630c..ef6c11a480787e47bee2a30c91fa7370925449ee 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 a198ef344cf3a0a5610b45ce5633040b2e88222a..f5b652b7b2f90e8f3d405214652708f51e8b521b 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 0000000000000000000000000000000000000000..dfe88a2792f387cf8cb3458d63903cea57ffbc04
--- /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 0000000000000000000000000000000000000000..5abf081c54efdcdabf40648e8d50572cc94d5489
--- /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