From 2b1bf8be0018830aaa5eb0ddcd8e26337f5783c6 Mon Sep 17 00:00:00 2001 From: Ziin Date: Mon, 16 Jun 2025 16:20:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=8D=95=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mysql/oauth2/OAuth2AccessTokenMapper.java | 9 +++++++ .../oauth2/OAuth2RefreshTokenMapper.java | 5 +++- .../service/oauth2/OAuth2TokenService.java | 5 ++++ .../oauth2/OAuth2TokenServiceImpl.java | 24 +++++++++++++++++++ .../src/main/resources/application.yaml | 4 +++- 5 files changed, 45 insertions(+), 2 deletions(-) diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java index 81ca13f..e17e9db 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; import cn.iocoder.yudao.module.system.controller.admin.oauth2.vo.token.OAuth2AccessTokenPageReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.apache.ibatis.annotations.Mapper; import java.time.LocalDateTime; @@ -32,4 +33,12 @@ public interface OAuth2AccessTokenMapper extends BaseMapperX selectListByUserId(Long userId) { + return selectList(OAuth2AccessTokenDO::getUserId, userId); + + } } diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.java index bf91457..354afe3 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.java @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2RefreshTokenDO; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.apache.ibatis.annotations.Mapper; @Mapper @@ -18,5 +19,7 @@ public interface OAuth2RefreshTokenMapper extends BaseMapperX scopes) { + // 在 yaml multiple-device-login = True 时 删除用户上次登录令牌,实现单设备登录 + if (multipleDeviceLoginConfig){ + removeAccessTokenByUserId(userId); + } OAuth2ClientDO clientDO = oauth2ClientService.validOAuthClientFromCache(clientId); // 创建刷新令牌 + OAuth2RefreshTokenDO refreshTokenDO = createOAuth2RefreshToken(userId, userType, clientDO, scopes); // 创建访问令牌 return createOAuth2AccessToken(refreshTokenDO, clientDO); @@ -99,6 +110,18 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService { return createOAuth2AccessToken(refreshTokenDO, clientDO); } + @Override + @Transactional(rollbackFor = Exception.class) + public void removeAccessTokenByUserId(Long userId) { + List oAuth2AccessTokenDOList = oauth2AccessTokenMapper.selectListByUserId(userId); + if (!CollectionUtils.isAnyEmpty(oAuth2AccessTokenDOList)) { + oauth2AccessTokenRedisDAO.deleteList(oAuth2AccessTokenDOList.stream().map(OAuth2AccessTokenDO::getAccessToken).collect(Collectors.toList())); + + } + oauth2AccessTokenMapper.deleteByUserId(userId); + oauth2RefreshTokenMapper.deleteByUserId(userId); + } + @Override public OAuth2AccessTokenDO getAccessToken(String accessToken) { // 优先从 Redis 中获取 @@ -126,6 +149,7 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService { return accessTokenDO; } + @Override public OAuth2AccessTokenDO checkAccessToken(String accessToken) { OAuth2AccessTokenDO accessTokenDO = getAccessToken(accessToken); diff --git a/yudao-server/src/main/resources/application.yaml b/yudao-server/src/main/resources/application.yaml index d1db7e6..0c75ce3 100644 --- a/yudao-server/src/main/resources/application.yaml +++ b/yudao-server/src/main/resources/application.yaml @@ -227,4 +227,6 @@ pf4j: pluginsDir: /Users/anhaohao/code/gitee/ruoyi-vue-pro/plugins # 插件目录 md5: - salt: (-FhqvXO,wMz \ No newline at end of file + salt: (-FhqvXO,wMz + +multiple-device-login: true \ No newline at end of file