diff --git a/cf-gateway/src/main/java/com/cf/imes/gateway/filter/security/LoginUser.java b/cf-gateway/src/main/java/com/cf/imes/gateway/filter/security/LoginUser.java index c2ef04fbe..646ecada7 100644 --- a/cf-gateway/src/main/java/com/cf/imes/gateway/filter/security/LoginUser.java +++ b/cf-gateway/src/main/java/com/cf/imes/gateway/filter/security/LoginUser.java @@ -59,4 +59,9 @@ public class LoginUser { * 部门编号 */ private Long deptId; + + /** + * 灰度版本号 + */ + private String grayVersion; } diff --git a/cf-gateway/src/main/java/com/cf/imes/gateway/filter/security/TokenAuthenticationFilter.java b/cf-gateway/src/main/java/com/cf/imes/gateway/filter/security/TokenAuthenticationFilter.java index 7bed95d46..3de9bffa7 100644 --- a/cf-gateway/src/main/java/com/cf/imes/gateway/filter/security/TokenAuthenticationFilter.java +++ b/cf-gateway/src/main/java/com/cf/imes/gateway/filter/security/TokenAuthenticationFilter.java @@ -150,7 +150,7 @@ public class TokenAuthenticationFilter implements GlobalFilter, Ordered { .setOrganId(tokenInfo.getOrganId()).setScopes(tokenInfo.getScopes()) .setLarge(tokenInfo.getLarge()).setDbNo(tokenInfo.getDbNo()).setTableNo(tokenInfo.getTableNo()) .setDataCode(tokenInfo.getDataCode()).setIsSupAdmin(tokenInfo.getIsSupAdmin()) - .setNickname(tokenInfo.getNickname()).setDeptId(tokenInfo.getDeptId()); + .setNickname(tokenInfo.getNickname()).setDeptId(tokenInfo.getDeptId()).setGrayVersion(tokenInfo.getGrayVersion()); } @Override diff --git a/cf-gateway/src/main/java/com/cf/imes/gateway/util/SecurityFrameworkUtils.java b/cf-gateway/src/main/java/com/cf/imes/gateway/util/SecurityFrameworkUtils.java index 8d6eeb5ae..956f0b786 100644 --- a/cf-gateway/src/main/java/com/cf/imes/gateway/util/SecurityFrameworkUtils.java +++ b/cf-gateway/src/main/java/com/cf/imes/gateway/util/SecurityFrameworkUtils.java @@ -29,6 +29,8 @@ public class SecurityFrameworkUtils { private static final String LOGIN_USER_HEADER = "login-user"; + private static final String LOGIN_USER_GRAY_VERSION = "version"; + private static final String LOGIN_USER_ID_ATTR = "login-user-id"; private static final String LOGIN_USER_TYPE_ATTR = "login-user-type"; private static final String DATA_CODE = "data-code"; @@ -122,6 +124,11 @@ public class SecurityFrameworkUtils { } builder.header(DATA_CODE, user.getDataCode()); builder.header(ORGAN_ID, user.getOrganId().toString()); + // 灰度版本号设置到headers,继续往下filter选择实例 + String grayVersion = user.getGrayVersion(); + if (StringUtils.hasText(grayVersion)) { + builder.header(LOGIN_USER_GRAY_VERSION, grayVersion); + } } public static void setOrganHeader(ServerHttpRequest.Builder builder, LoginUser user) { diff --git a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java index dbde9021a..ce707e482 100644 --- a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java +++ b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java @@ -37,4 +37,7 @@ public class OAuth2AccessTokenCheckRespDTO implements Serializable { @Schema(description = "部门编号", example = "1") private Long deptId; + + @Schema(description = "灰度版本号", example = "1") + private String grayVersion; } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.java index ff725f935..914ef51a8 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.java @@ -94,6 +94,15 @@ public class OAuth2AccessTokenDO extends BaseDO { */ private Boolean isSupAdmin; + /** + * 部门id + */ @TableField(exist = false) private Long deptId; + + /** + * 灰度版本号 + */ + @TableField(exist = false) + private String grayVersion; } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/organ/OrganizationDO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/organ/OrganizationDO.java index 8a4a8935b..ec6c7d293 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/organ/OrganizationDO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/organ/OrganizationDO.java @@ -147,4 +147,9 @@ public class OrganizationDO extends BaseDO { * 纬度 */ private String latitude; + + /** + * 灰度版本号 + */ + private String grayVersion; } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/user/AdminUserDO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/user/AdminUserDO.java index a45fcf8c9..f70fb2e58 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/user/AdminUserDO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/user/AdminUserDO.java @@ -106,4 +106,9 @@ public class AdminUserDO extends OrganBaseDO { */ private String pinyinFull; + /** + * 灰度版本号 + */ + @TableField(exist = false) + private String grayVersion; } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/redis/oauth2/OAuth2AccessTokenRedisDAO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/redis/oauth2/OAuth2AccessTokenRedisDAO.java index b39def5d2..cbe1d9421 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/redis/oauth2/OAuth2AccessTokenRedisDAO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/redis/oauth2/OAuth2AccessTokenRedisDAO.java @@ -1,6 +1,5 @@ package com.cf.imes.module.system.dal.redis.oauth2; -import cn.hutool.core.date.LocalDateTimeUtil; import com.cf.imes.framework.common.util.collection.CollectionUtils; import com.cf.imes.framework.common.util.json.JsonUtils; import com.cf.imes.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; @@ -11,8 +10,6 @@ import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Repository; import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; import java.util.Collection; import java.util.List; import java.util.concurrent.TimeUnit; @@ -55,11 +52,9 @@ public class OAuth2AccessTokenRedisDAO { String redisKey = formatKey(accessTokenDO.getAccessToken()); // 清理多余字段,避免缓存 accessTokenDO.setUpdater(null).setUpdateTime(null).setCreateTime(null).setCreator(null).setDeleted(null); - long time = LocalDateTimeUtil.between(LocalDateTime.now(), accessTokenDO.getExpiresTime(), ChronoUnit.SECONDS); - if (time > 0) { - String jsonString = JsonUtils.toJsonString(accessTokenDO); - stringRedisTemplate.opsForValue().set(redisKey, jsonString, time, TimeUnit.SECONDS); - } + // 创建有效期1天的token + String jsonString = JsonUtils.toJsonString(accessTokenDO); + stringRedisTemplate.opsForValue().set(redisKey, jsonString, 1, TimeUnit.DAYS); } /** diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/auth/AdminAuthServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/auth/AdminAuthServiceImpl.java index e9ebe956b..f0cc57660 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/auth/AdminAuthServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/auth/AdminAuthServiceImpl.java @@ -141,6 +141,8 @@ public class AdminAuthServiceImpl implements AdminAuthService { if (StringUtils.isBlank(dataSourceCode)) { throw exception(ORGAN_DATA_CODE_NOT_EXISTS); } + // 机构的灰度版本设置到user + user.setGrayVersion(organ.getGrayVersion()); // 创建 Token 令牌,记录登录日志 return createTokenAfterLoginSuccess(user, reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME, dataSourceCode); } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/oauth2/OAuth2TokenServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/oauth2/OAuth2TokenServiceImpl.java index dfdfafdec..f0887a848 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/oauth2/OAuth2TokenServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/oauth2/OAuth2TokenServiceImpl.java @@ -86,16 +86,15 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService { OAuth2AccessTokenDO refreshTokenDO = createOAuth2ReToken(userId, userType, clientDO, scopes, large, dbNo, tableNo, dataCode, organId, nickname); // 创建访问令牌 - return createOAuth2AccessToken(refreshTokenDO, clientDO); + return createOAuth2AccessToken(refreshTokenDO); } @Override public OAuth2AccessTokenDO createAccessToken(AdminUserDO user, Integer userType, String clientId, String dataCode) { - OAuth2ClientDO clientDO = oauth2ClientService.validOAuthClientFromCache(clientId); // 填入访问令牌包含的字段 - OAuth2AccessTokenDO refreshTokenDO = createOAuth2ReToken(user, userType, clientDO, dataCode); + OAuth2AccessTokenDO refreshTokenDO = createOAuth2ReToken(user, userType, dataCode); // 创建访问令牌 - return createOAuth2AccessToken(refreshTokenDO, clientDO); + return createOAuth2AccessToken(refreshTokenDO); } @Override @@ -214,15 +213,17 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService { } // 填入访问令牌包含的字段 - private OAuth2AccessTokenDO createOAuth2ReToken(AdminUserDO user, Integer userType, OAuth2ClientDO clientDO, String dataCode) { + private OAuth2AccessTokenDO createOAuth2ReToken(AdminUserDO user, Integer userType, String dataCode) { Long organId = user.getOrganId(); Long userId = user.getId(); - OAuth2AccessTokenDO refreshToken = new OAuth2AccessTokenDO().setRefreshToken(generateRefreshToken()) - .setUserId(userId).setUserType(userType) - .setClientId(clientDO.getClientId()) - .setExpiresTime(LocalDateTime.now().plusSeconds(clientDO.getRefreshTokenValiditySeconds())) + OAuth2AccessTokenDO refreshToken = new OAuth2AccessTokenDO() + .setUserId(userId) + .setUserType(userType) .setDataCode(dataCode) - .setOrganId(organId).setNickname(user.getNickname()).setDeptId(user.getDeptId()); + .setOrganId(organId) + .setNickname(user.getNickname()) + .setDeptId(user.getDeptId()) + .setGrayVersion(user.getGrayVersion()); if (organId != null) { OrganContextHolder.setOrganId(organId); } @@ -232,18 +233,10 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService { } // 在Redis中新增Token,除去刷新Token字段 - private OAuth2AccessTokenDO createOAuth2AccessToken(OAuth2AccessTokenDO refreshTokenDO, OAuth2ClientDO clientDO) { + private OAuth2AccessTokenDO createOAuth2AccessToken(OAuth2AccessTokenDO accessTokenDO) { String currentToken = generateAccessToken(); - Long userId = refreshTokenDO.getUserId(); - OAuth2AccessTokenDO accessTokenDO = new OAuth2AccessTokenDO().setAccessToken(currentToken) - .setUserId(userId).setUserType(refreshTokenDO.getUserType()) - .setClientId(clientDO.getClientId()).setScopes(refreshTokenDO.getScopes()) - .setRefreshToken(refreshTokenDO.getRefreshToken()) - .setExpiresTime(LocalDateTime.now().plusSeconds(clientDO.getAccessTokenValiditySeconds())) - .setLarge(refreshTokenDO.getLarge()).setDbNo(refreshTokenDO.getDbNo()).setTableNo(refreshTokenDO.getTableNo()) - .setDataCode(refreshTokenDO.getDataCode()).setOrganId(refreshTokenDO.getOrganId()) - .setNickname(refreshTokenDO.getNickname()).setIsSupAdmin(refreshTokenDO.getIsSupAdmin()) - .setDeptId(refreshTokenDO.getDeptId()); + Long userId = accessTokenDO.getUserId(); + accessTokenDO.setAccessToken(currentToken); // 记录到 Redis 中 oauth2AccessTokenRedisDAO.set(accessTokenDO); // 异步踢出其他token