From 2d2a995a83efcaaba969a0c5236d5c50257974d5 Mon Sep 17 00:00:00 2001 From: qraddx Date: Sat, 5 Feb 2022 17:10:33 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20Introducing=20new=20features.=20cl?= =?UTF-8?q?ose=20#3598=20=E3=80=90=E6=96=B0=E7=89=B9=E6=80=A7=E3=80=91?= =?UTF-8?q?=E7=BB=88=E7=AB=AF=E7=AE=A1=E7=90=86=E6=94=AF=E6=8C=81=E5=9B=BE?= =?UTF-8?q?=E5=BD=A2=E5=8C=96=E9=85=8D=E7=BD=AE=E7=99=BB=E5=BD=95=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E9=87=8D=E6=96=B0=E7=94=9F=E6=88=90=E4=BB=A4=E7=89=8C?= =?UTF-8?q?=EF=BC=8C=E6=8E=A7=E5=88=B6=E6=98=AF=E5=90=A6=E5=85=81=E8=AE=B8?= =?UTF-8?q?=E5=90=8C=E4=B8=80=E8=B4=A6=E5=8F=B7=E6=98=AF=E5=90=A6=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E5=A4=9A=E5=A4=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/constant/SecurityConstants.java | 5 ++++ .../service/PigxCustomTokenServices.java | 28 ++++++++++++++++++- .../api/dto/SysOauthClientDetailsDTO.java | 5 ++++ .../SysOauthClientDetailsServiceImpl.java | 13 ++++++--- 4 files changed, 46 insertions(+), 5 deletions(-) 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