From dd0d1907a7d13c278ad3add847ce2c6397aa7da7 Mon Sep 17 00:00:00 2001 From: tongtongstudio Date: Thu, 11 Sep 2025 14:19:39 +0800 Subject: [PATCH] =?UTF-8?q?=E9=89=B4=E6=9D=83=E5=B9=B3=E6=9D=BF=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E4=B8=8D=E5=90=8C=E7=9A=84code=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=94=A8=E6=88=B7=E8=8E=B7=E5=8F=96=E8=81=94=E7=B3=BB?= =?UTF-8?q?=E4=BA=BA=E5=88=97=E8=A1=A8=EF=BC=8C=E6=9C=AA=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/pub/LoginController.java | 7 +++- .../controller/user/ContactController.java | 37 +++++++++++++++++++ .../filter/JwtAuthenticationFilter.java | 17 +++++++-- 3 files changed, 57 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/onekeycall/videotablet/controller/pub/LoginController.java b/src/main/java/com/onekeycall/videotablet/controller/pub/LoginController.java index 7432851..f76be10 100644 --- a/src/main/java/com/onekeycall/videotablet/controller/pub/LoginController.java +++ b/src/main/java/com/onekeycall/videotablet/controller/pub/LoginController.java @@ -83,7 +83,12 @@ public class LoginController { User userDetails = (User) authentication.getPrincipal(); TokenPair tokenPair = jwtUtil.generateTokenPair(userDetails.getUserId(), deviceId); // 4. 返回 Token - return Result.ok().data(Collections.singletonMap("token", tokenPair.toMap())); + Map tokenMap = new HashMap<>(); + tokenMap.put("new_user", user.isNewUser()); + tokenMap.put("user_id", user.getUserId()); + tokenMap.put("has_password", user.isHasPassword()); + tokenMap.put("token", tokenPair.toMap()); + return Result.ok().data(tokenMap); } catch (Exception e) { e.printStackTrace(); return Result.error().message("登录失败:密码错误"); diff --git a/src/main/java/com/onekeycall/videotablet/controller/user/ContactController.java b/src/main/java/com/onekeycall/videotablet/controller/user/ContactController.java index dd1c334..476ebd3 100644 --- a/src/main/java/com/onekeycall/videotablet/controller/user/ContactController.java +++ b/src/main/java/com/onekeycall/videotablet/controller/user/ContactController.java @@ -10,6 +10,7 @@ import com.onekeycall.videotablet.service.ContactService; import com.onekeycall.videotablet.service.DeviceSnService; import com.onekeycall.videotablet.service.UserService; import com.onekeycall.videotablet.utils.JwtUtil; +import com.onekeycall.videotablet.utils.TextUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -17,6 +18,8 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.util.List; + @RestController @RequestMapping("/user") public class ContactController { @@ -77,4 +80,38 @@ public class ContactController { return Result.ok(); } + + @GetMapping("/get_contacts") + public Result getContacts( + @RequestHeader("Authorization") String authHeader, @RequestHeader("Device-ID") String deviceId, + @RequestParam(value = "user_id") String userId, @RequestParam(value = "sn") String sn + ) { + if (!authHeader.startsWith("Bearer ")) { + return Result.error().message("Invalid Authorization header"); + } + String token = authHeader.substring(7); // 去掉 "Bearer " 前缀 + + if (!jwtUtil.validateAccessToken(userId, token, deviceId)) { + return Result.error().message("Invalid token"); + } + + User user = userService.getUserByUserId(userId); + if (user == null) { + return Result.error().message("user not found"); + } + DeviceInfo deviceInfo = deviceSnService.findBySn(sn); + if (deviceInfo == null) { + return Result.error().message("device not found"); + } + + if (!deviceInfo.getUserId().equals(userId)) { + return Result.error().message("device not belong to user"); + } + + List contacts = contactService.findAllBySn(sn); + if (contacts == null || contacts.isEmpty()) { + return Result.notFound().message("contacts not found"); + } + return Result.ok().data("contacts", contacts); + } } diff --git a/src/main/java/com/onekeycall/videotablet/filter/JwtAuthenticationFilter.java b/src/main/java/com/onekeycall/videotablet/filter/JwtAuthenticationFilter.java index 1b8fe67..20b5e4e 100644 --- a/src/main/java/com/onekeycall/videotablet/filter/JwtAuthenticationFilter.java +++ b/src/main/java/com/onekeycall/videotablet/filter/JwtAuthenticationFilter.java @@ -73,7 +73,7 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { logger.debug("Extracted username: " + username); } catch (Exception e) { logger.error("Token解析失败 | Token: " + jwt, e); - setResponse(response, Result.unAuthorized().message("Invalid credentials")); + setUnauthorizedResponse(response, Result.unAuthorized().message("Invalid credentials")); return; // 重要!验证失败时终止过滤器链 } } @@ -100,7 +100,7 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { logger.debug("Successfully authenticated user: " + username); } else { logger.warn("Token验证失败 | User: " + username); - setResponse(response, Result.unAuthorized().message("Token validation failed")); + setUnauthorizedResponse(response, Result.unAuthorized().message("Token validation failed")); return; // 重要!验证失败时终止过滤器链 } } @@ -162,7 +162,7 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { // 调用SN验证服务(假设有SNService) if (!jwtUtil.validateDeviceToken(deviceToken, deviceId, sn)) { logger.warn("SN验证失败 | DeviceID: {} | SN: {}", deviceId, sn); - setResponse(response, Result.unAuthorized().message("设备验证失败")); + setUnauthorizedResponse(response, Result.unAuthorized().message("设备验证失败")); return; } logger.debug("SN验证成功 | DeviceID: {} | SN: {}", deviceId, sn); @@ -194,5 +194,16 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { response.getWriter().flush(); response.getWriter().close(); } + + + private void setUnauthorizedResponse(HttpServletResponse response, Result result) throws IOException { + SecurityContextHolder.clearContext(); + + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 设置为200状态码 + response.setContentType("application/json;charset=utf-8"); + response.getWriter().write(GsonUtils.toJSONString(result)); + response.getWriter().flush(); + response.getWriter().close(); + } }