From 011d25de6bfa562a1db4ae89994ee8e911060db6 Mon Sep 17 00:00:00 2001 From: lengleng Date: Mon, 7 Dec 2020 11:36:14 +0800 Subject: [PATCH] =?UTF-8?q?:recycle:=20Refactoring=20code.=20#2115=20?= =?UTF-8?q?=E8=AE=A4=E8=AF=81=E4=B8=AD=E5=BF=83=20=E5=92=8C=20=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E8=A7=A3=E8=80=A6=EF=BC=8C=E9=80=9A=E8=BF=87?= =?UTF-8?q?feign=20=E8=B0=83=E7=94=A8=E6=95=B0=E6=8D=AE=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pigx-auth/pom.xml | 15 ------ .../service/PigxClientDetailsServiceImpl.java | 32 ++++++++----- .../service/PigxUserDetailsServiceImpl.java | 2 +- .../api/feign/RemoteClientDetailsService.java | 48 +++++++++++++++++++ .../admin/controller/SysClientController.java | 8 ++++ 5 files changed, 78 insertions(+), 27 deletions(-) create mode 100644 pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteClientDetailsService.java diff --git a/pigx-auth/pom.xml b/pigx-auth/pom.xml index a342d27a2..20b46c7e9 100644 --- a/pigx-auth/pom.xml +++ b/pigx-auth/pom.xml @@ -58,11 +58,6 @@ com.pig4cloud pigx-common-feign - - - mysql - mysql-connector-java - com.pig4cloud @@ -78,16 +73,6 @@ com.pig4cloud pigx-common-gray - - - org.springframework.boot - spring-boot-starter-jdbc - - - - com.alibaba - druid-spring-boot-starter - org.springframework.boot diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/service/PigxClientDetailsServiceImpl.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/service/PigxClientDetailsServiceImpl.java index 5b0177ee7..e80ddfe83 100644 --- a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/service/PigxClientDetailsServiceImpl.java +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/service/PigxClientDetailsServiceImpl.java @@ -1,16 +1,18 @@ package com.pig4cloud.pigx.auth.service; +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.data.tenant.TenantContextHolder; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.BeanUtils; import org.springframework.cache.annotation.Cacheable; import org.springframework.security.oauth2.common.exceptions.InvalidClientException; import org.springframework.security.oauth2.provider.ClientDetails; -import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; +import org.springframework.security.oauth2.provider.ClientDetailsService; +import org.springframework.security.oauth2.provider.client.BaseClientDetails; import org.springframework.stereotype.Service; -import javax.sql.DataSource; - /** * @author lengleng * @date 2020/03/25 @@ -18,11 +20,10 @@ import javax.sql.DataSource; * 扩展 JdbcClientDetailsService 支持多租户 */ @Service -public class PigxClientDetailsServiceImpl extends JdbcClientDetailsService { +@RequiredArgsConstructor +public class PigxClientDetailsServiceImpl implements ClientDetailsService { - public PigxClientDetailsServiceImpl(DataSource dataSource) { - super(dataSource); - } + private final RemoteClientDetailsService clientDetailsService; /** * 重写原生方法支持redis缓存 @@ -33,9 +34,18 @@ public class PigxClientDetailsServiceImpl extends JdbcClientDetailsService { @Override @Cacheable(value = CacheConstants.CLIENT_DETAILS_KEY, key = "#clientId", unless = "#result == null") public ClientDetails loadClientByClientId(String clientId) { - super.setSelectClientDetailsSql( - String.format(SecurityConstants.DEFAULT_SELECT_STATEMENT, TenantContextHolder.getTenantId())); - return super.loadClientByClientId(clientId); + SysOauthClientDetails clientDetails = clientDetailsService + .getClientDetailsById(clientId, SecurityConstants.FROM_IN).getData(); + + if (clientDetails == null) { + return null; + } + + // copy原值 + BaseClientDetails client = new BaseClientDetails(); + BeanUtils.copyProperties(clientDetails, client); + client.setClientSecret(String.format("{noop}%s", clientDetails.getClientSecret())); + return client; } } diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUserDetailsServiceImpl.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUserDetailsServiceImpl.java index 2696be5ce..ea2ee0740 100644 --- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUserDetailsServiceImpl.java +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUserDetailsServiceImpl.java @@ -65,7 +65,7 @@ public class PigxUserDetailsServiceImpl implements PigxUserDetailsService { public UserDetails loadUserByUsername(String username) { Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS); if (cache != null && cache.get(username) != null) { - return (PigxUser) cache.get(username).get(); + return cache.get(username, PigxUser.class); } R result = remoteUserService.info(username, SecurityConstants.FROM_IN); 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 new file mode 100644 index 000000000..a15d1b877 --- /dev/null +++ b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteClientDetailsService.java @@ -0,0 +1,48 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.api.feign; + +import com.pig4cloud.pigx.admin.api.entity.SysOauthClientDetails; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestHeader; + +/** + * @author lengleng + * @date 2020/12/05 + */ +@FeignClient(contextId = "remoteClientDetailsService", value = ServiceNameConstants.UPMS_SERVICE) +public interface RemoteClientDetailsService { + + /** + * 通过clientId 查询客户端信息 + * @param clientId 用户名 + * @param from 调用标志 + * @return R + */ + @GetMapping("/client/getClientDetailsById/{clientId}") + R getClientDetailsById(@PathVariable("clientId") String clientId, + @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 5ec64fdd4..9b5375748 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 @@ -26,6 +26,7 @@ import com.pig4cloud.pigx.admin.api.entity.SysOauthClientDetails; import com.pig4cloud.pigx.admin.service.SysOauthClientDetailsService; import com.pig4cloud.pigx.common.core.util.R; import com.pig4cloud.pigx.common.log.annotation.SysLog; +import com.pig4cloud.pigx.common.security.annotation.Inner; import io.swagger.annotations.Api; import lombok.AllArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; @@ -107,4 +108,11 @@ public class SysClientController { return R.ok(clientDetailsService.updateClientById(clientDetailsDTO)); } + @Inner(false) + @GetMapping("/getClientDetailsById/{clientId}") + public R getClientDetailsById(@PathVariable String clientId) { + return R.ok(clientDetailsService.getOne( + Wrappers.lambdaQuery().eq(SysOauthClientDetails::getClientId, clientId), false)); + } + }