feat: 登出接口

This commit is contained in:
2026-06-17 10:16:39 +08:00
parent 39d4c018e4
commit b512d50c78
4 changed files with 43 additions and 0 deletions

View File

@@ -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 {
}

View File

@@ -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<Void> logout(@Valid @RequestBody LogoutRequest request) {
accountService.logout(request.refreshToken());
return ApiResponse.ok(null);
}
}

View File

@@ -32,4 +32,11 @@ public interface AccountService {
* @return 新的双 tokenaccessToken + refreshToken
*/
LoginResponse refresh(String refreshToken);
/**
* 登出,使 access token 和 refresh token 失效
*
* @param refreshToken 刷新令牌
*/
void logout(String refreshToken);
}

View File

@@ -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位随机数字用于默认昵称
*/