diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/SecurityConstants.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/SecurityConstants.java index c8366b35a..d2ce2618f 100644 --- a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/SecurityConstants.java +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/SecurityConstants.java @@ -175,6 +175,11 @@ public interface SecurityConstants { */ String CLIENT_ID = "client_id"; + /** + * 客户端唯一令牌 + */ + String CLIENT_RECREATE = "recreate_flag"; + /** * 用户ID字段 */ diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxCustomTokenServices.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxCustomTokenServices.java index 1d5ef53d4..fe397e9c0 100644 --- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxCustomTokenServices.java +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxCustomTokenServices.java @@ -1,5 +1,7 @@ package com.pig4cloud.pigx.common.security.service; +import cn.hutool.core.map.MapUtil; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; import org.springframework.beans.factory.InitializingBean; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.core.Authentication; @@ -15,6 +17,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import java.util.Date; +import java.util.Map; import java.util.Set; import java.util.UUID; @@ -56,14 +59,37 @@ public class PigxCustomTokenServices implements AuthorizationServerTokenServices OAuth2AccessToken existingAccessToken = tokenStore.getAccessToken(authentication); OAuth2RefreshToken refreshToken = null; + // 根据clientId 查询客户端信息,判断客户端是否是每次生成新的令牌 recreate + String clientId = authentication.getOAuth2Request().getClientId(); + ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId); + Map extMap = clientDetails.getAdditionalInformation(); + Boolean recreate = MapUtil.getBool(extMap, SecurityConstants.CLIENT_RECREATE, Boolean.TRUE); + // 若已产生token , 过期时删除相关token,执行下边的重新生成逻辑 - if (existingAccessToken != null) { + if (existingAccessToken != null && recreate) { tokenStore.removeAccessToken(existingAccessToken); if (existingAccessToken.getRefreshToken() != null) { refreshToken = existingAccessToken.getRefreshToken(); tokenStore.removeRefreshToken(refreshToken); } } + else if (existingAccessToken != null) { + if (existingAccessToken.isExpired()) { + if (existingAccessToken.getRefreshToken() != null) { + refreshToken = existingAccessToken.getRefreshToken(); + // The token store could remove the refresh token when the + // access token is removed, but we want to + // be sure... + tokenStore.removeRefreshToken(refreshToken); + } + tokenStore.removeAccessToken(existingAccessToken); + } + else { + // Re-store the access token in case the authentication has changed + tokenStore.storeAccessToken(existingAccessToken, authentication); + return existingAccessToken; + } + } if (refreshToken == null) { refreshToken = createRefreshToken(authentication); diff --git a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/SysOauthClientDetailsDTO.java b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/SysOauthClientDetailsDTO.java index dcc3e5a4d..c1dc2b99d 100644 --- a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/SysOauthClientDetailsDTO.java +++ b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/SysOauthClientDetailsDTO.java @@ -22,4 +22,9 @@ public class SysOauthClientDetailsDTO extends SysOauthClientDetails { */ private String encFlag; + /** + * 令牌是否重新生成 + */ + private String recreateFlag; + } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysOauthClientDetailsServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysOauthClientDetailsServiceImpl.java index a37f93c1b..a05be3817 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysOauthClientDetailsServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysOauthClientDetailsServiceImpl.java @@ -31,6 +31,7 @@ import com.pig4cloud.pigx.admin.mapper.SysOauthClientDetailsMapper; import com.pig4cloud.pigx.admin.service.SysOauthClientDetailsService; import com.pig4cloud.pigx.common.core.constant.CacheConstants; import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; import com.pig4cloud.pigx.common.core.util.R; import com.pig4cloud.pigx.common.core.util.SpringContextHolder; import lombok.RequiredArgsConstructor; @@ -56,8 +57,6 @@ import java.util.stream.Collectors; public class SysOauthClientDetailsServiceImpl extends ServiceImpl implements SysOauthClientDetailsService { - private final RedisTemplate redisTemplate; - /** * 通过ID删除客户端 * @param clientId @@ -90,7 +89,9 @@ public class SysOauthClientDetailsServiceImpl extends ServiceImpl