From b512d50c78351fd32b806ab3e7aaf488f7e129fe Mon Sep 17 00:00:00 2001 From: Azure <983547216@qq.com> Date: Wed, 17 Jun 2026 10:16:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=99=BB=E5=87=BA=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/dto/account/LogoutRequest.java | 15 +++++++++++++++ .../controller/AccountController.java | 10 ++++++++++ .../webgamebackend/service/AccountService.java | 7 +++++++ .../service/impl/AccountServiceImpl.java | 11 +++++++++++ 4 files changed, 43 insertions(+) create mode 100644 src/main/java/com/webgame/webgamebackend/common/dto/account/LogoutRequest.java diff --git a/src/main/java/com/webgame/webgamebackend/common/dto/account/LogoutRequest.java b/src/main/java/com/webgame/webgamebackend/common/dto/account/LogoutRequest.java new file mode 100644 index 0000000..ac4de8d --- /dev/null +++ b/src/main/java/com/webgame/webgamebackend/common/dto/account/LogoutRequest.java @@ -0,0 +1,15 @@ +package com.webgame.webgamebackend.common.dto.account; + +import com.webgame.webgamebackend.common.dto.base.BaseVo; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +/** + * 登出请求 + */ +public record LogoutRequest( + @NotNull(message = "刷新令牌不能为null") + @NotBlank(message = "刷新令牌不能为空") + String refreshToken +) implements BaseVo { +} diff --git a/src/main/java/com/webgame/webgamebackend/controller/AccountController.java b/src/main/java/com/webgame/webgamebackend/controller/AccountController.java index 49e526e..617a01d 100644 --- a/src/main/java/com/webgame/webgamebackend/controller/AccountController.java +++ b/src/main/java/com/webgame/webgamebackend/controller/AccountController.java @@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaIgnore; import com.webgame.webgamebackend.common.dto.ApiResponse; import com.webgame.webgamebackend.common.dto.account.LoginRequest; import com.webgame.webgamebackend.common.dto.account.LoginResponse; +import com.webgame.webgamebackend.common.dto.account.LogoutRequest; import com.webgame.webgamebackend.common.dto.account.RefreshTokenRequest; import com.webgame.webgamebackend.common.dto.account.RegisterRequest; import com.webgame.webgamebackend.service.AccountService; @@ -55,4 +56,13 @@ public class AccountController { LoginResponse result = accountService.refresh(request.refreshToken()); return ApiResponse.ok(result); } + + /** + * 登出,使 access token 和 refresh token 失效 + */ + @PostMapping("/logout") + public ApiResponse logout(@Valid @RequestBody LogoutRequest request) { + accountService.logout(request.refreshToken()); + return ApiResponse.ok(null); + } } diff --git a/src/main/java/com/webgame/webgamebackend/service/AccountService.java b/src/main/java/com/webgame/webgamebackend/service/AccountService.java index a11ca7a..4b4453d 100644 --- a/src/main/java/com/webgame/webgamebackend/service/AccountService.java +++ b/src/main/java/com/webgame/webgamebackend/service/AccountService.java @@ -32,4 +32,11 @@ public interface AccountService { * @return 新的双 token(accessToken + refreshToken) */ LoginResponse refresh(String refreshToken); + + /** + * 登出,使 access token 和 refresh token 失效 + * + * @param refreshToken 刷新令牌 + */ + void logout(String refreshToken); } diff --git a/src/main/java/com/webgame/webgamebackend/service/impl/AccountServiceImpl.java b/src/main/java/com/webgame/webgamebackend/service/impl/AccountServiceImpl.java index 86533a3..b1cacdb 100644 --- a/src/main/java/com/webgame/webgamebackend/service/impl/AccountServiceImpl.java +++ b/src/main/java/com/webgame/webgamebackend/service/impl/AccountServiceImpl.java @@ -89,6 +89,17 @@ public class AccountServiceImpl implements AccountService { return new LoginResponse(accessToken, refreshToken); } + @Override + public void logout(String refreshToken) { + // 获取当前登录用户ID(用于日志) + String loginId = (String) StpUtil.getLoginId(); + // 登出 Sa-Token,使 access token 失效 + StpUtil.logout(); + // 撤销 refresh token,使其在 Redis 中删除 + refreshTokenService.revoke(refreshToken); + log.info("用户已登出: userId={}", loginId); + } + /** * 生成6位随机数字,用于默认昵称 */