Commit a9928fa22713ee59385ebe59dc0298c7a6fb7ac1
1 parent
c2937bd0
【功能优化】SYSTEM:支持通过 refreshToken 认证,解决部分场景不方便刷新访问令牌场景
Showing
4 changed files
with
17 additions
and
16 deletions
yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/db/TenantDatabaseInterceptor.java
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/oauth2/OAuth2TokenServiceImpl.java
| ... | ... | @@ -109,19 +109,18 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService { |
| 109 | 109 | |
| 110 | 110 | // 获取不到,从 MySQL 中获取访问令牌 |
| 111 | 111 | accessTokenDO = oauth2AccessTokenMapper.selectByAccessToken(accessToken); |
| 112 | - if (accessTokenDO != null && DateUtils.isExpired(accessTokenDO.getExpiresTime())) { | |
| 113 | - accessTokenDO = null; | |
| 114 | - } | |
| 115 | - // 特殊:从 MySQL 中获取刷新令牌。原因:解决部分场景不方便刷新访问令牌场景 | |
| 116 | - // 例如说,积木报表只允许传递 token,不允许传递 refresh_token,导致无法刷新访问令牌 | |
| 117 | - // 再例如说,前端 WebSocket 的 token 直接跟在 url 上,无法传递 refresh_token | |
| 118 | - OAuth2RefreshTokenDO refreshTokenDO = oauth2RefreshTokenMapper.selectByRefreshToken(accessToken); | |
| 119 | - if (refreshTokenDO != null && !DateUtils.isExpired(refreshTokenDO.getExpiresTime())) { | |
| 120 | - accessTokenDO = convertToAccessToken(refreshTokenDO); | |
| 112 | + if (accessTokenDO == null) { | |
| 113 | + // 特殊:从 MySQL 中获取刷新令牌。原因:解决部分场景不方便刷新访问令牌场景 | |
| 114 | + // 例如说,积木报表只允许传递 token,不允许传递 refresh_token,导致无法刷新访问令牌 | |
| 115 | + // 再例如说,前端 WebSocket 的 token 直接跟在 url 上,无法传递 refresh_token | |
| 116 | + OAuth2RefreshTokenDO refreshTokenDO = oauth2RefreshTokenMapper.selectByRefreshToken(accessToken); | |
| 117 | + if (refreshTokenDO != null && !DateUtils.isExpired(refreshTokenDO.getExpiresTime())) { | |
| 118 | + accessTokenDO = convertToAccessToken(refreshTokenDO); | |
| 119 | + } | |
| 121 | 120 | } |
| 122 | 121 | |
| 123 | 122 | // 如果在 MySQL 存在,则往 Redis 中写入 |
| 124 | - if (accessTokenDO != null) { | |
| 123 | + if (accessTokenDO != null && !DateUtils.isExpired(accessTokenDO.getExpiresTime())) { | |
| 125 | 124 | oauth2AccessTokenRedisDAO.set(accessTokenDO); |
| 126 | 125 | } |
| 127 | 126 | return accessTokenDO; | ... | ... |
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/oauth2/OAuth2TokenServiceImplTest.java
| ... | ... | @@ -158,10 +158,11 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { |
| 158 | 158 | .setAccessTokenValiditySeconds(30); |
| 159 | 159 | when(oauth2ClientService.validOAuthClientFromCache(eq(clientId))).thenReturn(clientDO); |
| 160 | 160 | // mock 数据(访问令牌) |
| 161 | - OAuth2RefreshTokenDO refreshTokenDO = randomPojo(OAuth2RefreshTokenDO.class) | |
| 162 | - .setRefreshToken(refreshToken).setClientId(clientId) | |
| 163 | - .setExpiresTime(LocalDateTime.now().plusDays(1)) | |
| 164 | - .setUserType(UserTypeEnum.ADMIN.getValue()); | |
| 161 | + OAuth2RefreshTokenDO refreshTokenDO = randomPojo(OAuth2RefreshTokenDO.class, o -> | |
| 162 | + o.setRefreshToken(refreshToken).setClientId(clientId) | |
| 163 | + .setExpiresTime(LocalDateTime.now().plusDays(1)) | |
| 164 | + .setUserType(UserTypeEnum.ADMIN.getValue()) | |
| 165 | + .setTenantId(TenantContextHolder.getTenantId())); | |
| 165 | 166 | oauth2RefreshTokenMapper.insert(refreshTokenDO); |
| 166 | 167 | // mock 数据(访问令牌) |
| 167 | 168 | OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class).setRefreshToken(refreshToken) | ... | ... |
yudao-module-system/yudao-module-system-biz/src/test/resources/sql/create_tables.sql
| ... | ... | @@ -473,7 +473,7 @@ CREATE TABLE IF NOT EXISTS "system_oauth2_access_token" ( |
| 473 | 473 | "updater" varchar DEFAULT '', |
| 474 | 474 | "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, |
| 475 | 475 | "deleted" bit NOT NULL DEFAULT FALSE, |
| 476 | - "tenant_id" bigint NOT NULL, | |
| 476 | + "tenant_id" bigint not null, | |
| 477 | 477 | PRIMARY KEY ("id") |
| 478 | 478 | ) COMMENT 'OAuth2 访问令牌'; |
| 479 | 479 | |
| ... | ... | @@ -491,6 +491,7 @@ CREATE TABLE IF NOT EXISTS "system_oauth2_refresh_token" ( |
| 491 | 491 | "updater" varchar DEFAULT '', |
| 492 | 492 | "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, |
| 493 | 493 | "deleted" bit NOT NULL DEFAULT FALSE, |
| 494 | + "tenant_id" bigint not null default '0', | |
| 494 | 495 | PRIMARY KEY ("id") |
| 495 | 496 | ) COMMENT 'OAuth2 刷新令牌'; |
| 496 | 497 | ... | ... |