From c448dbe83237c58dd7c620072d79aca4cb1acafb Mon Sep 17 00:00:00 2001 From: YLC8E <382170522@qq.com> Date: Sun, 3 Oct 2021 00:29:11 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20Fixing=20a=20bug.=20closed=20#3159=20?= =?UTF-8?q?=E5=85=B3=E4=BA=8Euname=5Fto=5Faccess=5Fz=E7=9A=84=E7=96=91?= =?UTF-8?q?=E9=97=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :bug: Fixing a bug. closed #3159 关于uname_to_access_z的疑问 --- .../service/PigxTokenDealServiceImpl.java | 24 +++++++---------- .../PigxTokenStoreAutoConfiguration.java | 3 +-- .../PigxTokenStoreCleanSchedule.java | 26 +++++++++++++++++++ .../main/resources/META-INF/spring.factories | 3 ++- .../api/feign/RemoteClientDetailsService.java | 10 +++++++ .../admin/controller/SysClientController.java | 10 +++++++ .../gaea/business/filter/TokenFilter.java | 2 +- 7 files changed, 60 insertions(+), 18 deletions(-) rename pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/{serializer => component}/PigxTokenStoreAutoConfiguration.java (92%) create mode 100644 pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxTokenStoreCleanSchedule.java diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/service/PigxTokenDealServiceImpl.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/service/PigxTokenDealServiceImpl.java index 76b7cfacb..37d26e785 100644 --- a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/service/PigxTokenDealServiceImpl.java +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/service/PigxTokenDealServiceImpl.java @@ -2,6 +2,8 @@ package com.pig4cloud.pigx.auth.service; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.admin.api.entity.SysOauthClientDetails; +import com.pig4cloud.pigx.admin.api.feign.RemoteClientDetailsService; import com.pig4cloud.pigx.common.core.constant.CacheConstants; import com.pig4cloud.pigx.common.core.constant.SecurityConstants; import com.pig4cloud.pigx.common.core.util.KeyStrResolver; @@ -46,6 +48,8 @@ public class PigxTokenDealServiceImpl { private final KeyStrResolver keyStrResolver; + private final RemoteClientDetailsService clientDetailsService; + /** * 删除 请求令牌 和 刷新令牌 * @param token 请求令牌 @@ -81,20 +85,12 @@ public class PigxTokenDealServiceImpl { * @return R */ public R queryTokenByUsername(Page page, String username) { - String key = keyStrResolver.extract( - SecurityConstants.PIGX_PREFIX + SecurityConstants.OAUTH_PREFIX + "uname_to_access_z:", StrUtil.COLON); - - Object collect = redisTemplate.keys("*:" + username).stream().filter(k -> ((String) k).contains(key)) - .flatMap(k -> { - redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); - return redisTemplate.opsForZSet().range(k, 0, System.currentTimeMillis()).stream(); - }).collect(Collectors.toList()); - - if (collect instanceof List) { - List objSet = (List) collect; - page.setRecords(objSet); - page.setTotal(objSet.size()); - } + List oAuth2AccessTokenList = clientDetailsService + .listClientDetails(SecurityConstants.FROM_IN).getData().stream().map(SysOauthClientDetails::getClientId) + .flatMap(clientId -> tokenStore.findTokensByClientIdAndUserName(clientId, username).stream()).distinct() + .collect(Collectors.toList()); + page.setRecords(oAuth2AccessTokenList); + page.setTotal(oAuth2AccessTokenList.size()); return R.ok(page); } diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/serializer/PigxTokenStoreAutoConfiguration.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxTokenStoreAutoConfiguration.java similarity index 92% rename from pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/serializer/PigxTokenStoreAutoConfiguration.java rename to pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxTokenStoreAutoConfiguration.java index 67f395655..bcdec8128 100644 --- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/serializer/PigxTokenStoreAutoConfiguration.java +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxTokenStoreAutoConfiguration.java @@ -1,9 +1,8 @@ -package com.pig4cloud.pigx.common.security.serializer; +package com.pig4cloud.pigx.common.security.component; import cn.hutool.core.util.StrUtil; import com.pig4cloud.pigx.common.core.constant.SecurityConstants; import com.pig4cloud.pigx.common.core.util.KeyStrResolver; -import com.pig4cloud.pigx.common.security.component.PigxRedisTokenStore; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxTokenStoreCleanSchedule.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxTokenStoreCleanSchedule.java new file mode 100644 index 000000000..aee2a0354 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxTokenStoreCleanSchedule.java @@ -0,0 +1,26 @@ +package com.pig4cloud.pigx.common.security.component; + +import com.pig4cloud.pigx.common.core.util.SpringContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; + +/** + * @author lengleng + * @date 2021/10/3 + */ +@Slf4j +@EnableScheduling +@ConditionalOnBean(AuthorizationServerConfigurerAdapter.class) +public class PigxTokenStoreCleanSchedule { + + @Scheduled(cron = "@hourly") + public void doMaintenance() { + PigxRedisTokenStore tokenStore = SpringContextHolder.getBean(PigxRedisTokenStore.class); + long maintenance = tokenStore.doMaintenance(); + log.debug("清理Redis ZADD 过期 token 数量: {}", maintenance); + } + +} diff --git a/pigx-common/pigx-common-security/src/main/resources/META-INF/spring.factories b/pigx-common/pigx-common-security/src/main/resources/META-INF/spring.factories index a35a29590..661f6ebcc 100644 --- a/pigx-common/pigx-common-security/src/main/resources/META-INF/spring.factories +++ b/pigx-common/pigx-common-security/src/main/resources/META-INF/spring.factories @@ -2,7 +2,8 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.pig4cloud.pigx.common.security.component.PigxTokenEnhancer,\ com.pig4cloud.pigx.common.security.component.PigxSecurityInnerAspect,\ com.pig4cloud.pigx.common.security.service.PigxUserDetailsServiceImpl,\ - com.pig4cloud.pigx.common.security.serializer.PigxTokenStoreAutoConfiguration,\ + com.pig4cloud.pigx.common.security.component.PigxTokenStoreAutoConfiguration,\ + com.pig4cloud.pigx.common.security.component.PigxTokenStoreCleanSchedule,\ com.pig4cloud.pigx.common.security.listener.AuthenticationFailureEventListener,\ com.pig4cloud.pigx.common.security.listener.AuthenticationSuccessEventListener,\ com.pig4cloud.pigx.common.security.listener.AuthenticationLogoutSuccessEventListener diff --git a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteClientDetailsService.java b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteClientDetailsService.java index a15d1b877..b4989e795 100644 --- a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteClientDetailsService.java +++ b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteClientDetailsService.java @@ -28,6 +28,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestHeader; +import java.util.List; + /** * @author lengleng * @date 2020/12/05 @@ -45,4 +47,12 @@ public interface RemoteClientDetailsService { R getClientDetailsById(@PathVariable("clientId") String clientId, @RequestHeader(SecurityConstants.FROM) String from); + /** + * 查询全部客户端 + * @param from 调用标识 + * @return R + */ + @GetMapping("/client/list") + R> listClientDetails(@RequestHeader(SecurityConstants.FROM) String from); + } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysClientController.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysClientController.java index 9b5375748..55fb5396b 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysClientController.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysClientController.java @@ -115,4 +115,14 @@ public class SysClientController { Wrappers.lambdaQuery().eq(SysOauthClientDetails::getClientId, clientId), false)); } + /** + * 查询全部客户端 + * @return + */ + @Inner(false) + @GetMapping("/list") + public R listClients() { + return R.ok(clientDetailsService.list()); + } + } diff --git a/pigx-visual/pigx-report-platform/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java b/pigx-visual/pigx-report-platform/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java index 7dfa13090..72a3f0c3d 100644 --- a/pigx-visual/pigx-report-platform/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java +++ b/pigx-visual/pigx-report-platform/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java @@ -34,7 +34,7 @@ public class TokenFilter implements Filter { String method = request.getMethod(); - if (request.getRequestURI().contains("reportDashboard")){ + if (request.getRequestURI().contains("reportDashboard")) { // 执行 filterChain.doFilter(request, response); return;