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