feat: 登出接口
This commit is contained in:
@@ -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 {
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaIgnore;
|
|||||||
import com.webgame.webgamebackend.common.dto.ApiResponse;
|
import com.webgame.webgamebackend.common.dto.ApiResponse;
|
||||||
import com.webgame.webgamebackend.common.dto.account.LoginRequest;
|
import com.webgame.webgamebackend.common.dto.account.LoginRequest;
|
||||||
import com.webgame.webgamebackend.common.dto.account.LoginResponse;
|
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.RefreshTokenRequest;
|
||||||
import com.webgame.webgamebackend.common.dto.account.RegisterRequest;
|
import com.webgame.webgamebackend.common.dto.account.RegisterRequest;
|
||||||
import com.webgame.webgamebackend.service.AccountService;
|
import com.webgame.webgamebackend.service.AccountService;
|
||||||
@@ -55,4 +56,13 @@ public class AccountController {
|
|||||||
LoginResponse result = accountService.refresh(request.refreshToken());
|
LoginResponse result = accountService.refresh(request.refreshToken());
|
||||||
return ApiResponse.ok(result);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,4 +32,11 @@ public interface AccountService {
|
|||||||
* @return 新的双 token(accessToken + refreshToken)
|
* @return 新的双 token(accessToken + refreshToken)
|
||||||
*/
|
*/
|
||||||
LoginResponse refresh(String refreshToken);
|
LoginResponse refresh(String refreshToken);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登出,使 access token 和 refresh token 失效
|
||||||
|
*
|
||||||
|
* @param refreshToken 刷新令牌
|
||||||
|
*/
|
||||||
|
void logout(String refreshToken);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,6 +89,17 @@ public class AccountServiceImpl implements AccountService {
|
|||||||
return new LoginResponse(accessToken, refreshToken);
|
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位随机数字,用于默认昵称
|
* 生成6位随机数字,用于默认昵称
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user