From dbb4ae43738e81cf13f19f862dc43fd0caa4b702 Mon Sep 17 00:00:00 2001 From: lengleng Date: Mon, 7 Dec 2020 13:33:13 +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=20=20011d?= =?UTF-8?q?25de6bfa562a1db4ae89994ee8e911060db6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/PigxClientDetailsServiceImpl.java | 76 +++++++++++++++++-- 1 file changed, 70 insertions(+), 6 deletions(-) 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 e80ddfe83..892932d0e 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,17 +1,25 @@ package com.pig4cloud.pigx.auth.service; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; 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 lombok.RequiredArgsConstructor; -import org.springframework.beans.BeanUtils; +import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.Cacheable; +import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.oauth2.common.exceptions.InvalidClientException; import org.springframework.security.oauth2.provider.ClientDetails; import org.springframework.security.oauth2.provider.ClientDetailsService; import org.springframework.security.oauth2.provider.client.BaseClientDetails; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.util.Map; /** * @author lengleng @@ -19,6 +27,7 @@ import org.springframework.stereotype.Service; *

* 扩展 JdbcClientDetailsService 支持多租户 */ +@Slf4j @Service @RequiredArgsConstructor public class PigxClientDetailsServiceImpl implements ClientDetailsService { @@ -40,12 +49,67 @@ public class PigxClientDetailsServiceImpl implements ClientDetailsService { if (clientDetails == null) { return null; } + // 适配成oauth2内置类型 + return clientDetailsWrapper(clientDetails); + } - // copy原值 - BaseClientDetails client = new BaseClientDetails(); - BeanUtils.copyProperties(clientDetails, client); - client.setClientSecret(String.format("{noop}%s", clientDetails.getClientSecret())); - return client; + /** + * 客户端类型转化 参考 + * {@link org.springframework.security.oauth2.provider.client.JdbcClientDetailsService} + * @param origin 数据库保存参数 + * @return target oauth 类型客户端参数 + */ + private ClientDetails clientDetailsWrapper(SysOauthClientDetails origin) { + BaseClientDetails target = new BaseClientDetails(); + // 必选项 + target.setClientId(origin.getClientId()); + target.setClientSecret(String.format("{noop}%s", origin.getClientSecret())); + + if (ArrayUtil.isNotEmpty(origin.getAuthorizedGrantTypes())) { + target.setAuthorizedGrantTypes(CollUtil.newArrayList(origin.getAuthorizedGrantTypes())); + } + + if (StrUtil.isNotBlank(origin.getAuthorities())) { + target.setAuthorities(AuthorityUtils.commaSeparatedStringToAuthorityList(origin.getAuthorities())); + } + + if (StrUtil.isNotBlank(origin.getResourceIds())) { + target.setResourceIds(StringUtils.commaDelimitedListToSet(origin.getResourceIds())); + } + + if (StrUtil.isNotBlank(origin.getWebServerRedirectUri())) { + target.setRegisteredRedirectUri(StringUtils.commaDelimitedListToSet(origin.getWebServerRedirectUri())); + } + + if (StrUtil.isNotBlank(origin.getScope())) { + target.setScope(StringUtils.commaDelimitedListToSet(origin.getScope())); + } + + if (StrUtil.isNotBlank(origin.getAutoapprove())) { + target.setAutoApproveScopes(StringUtils.commaDelimitedListToSet(origin.getAutoapprove())); + } + + if (origin.getAccessTokenValidity() != null) { + target.setAccessTokenValiditySeconds(origin.getAccessTokenValidity()); + } + + if (origin.getRefreshTokenValidity() != null) { + target.setRefreshTokenValiditySeconds(origin.getRefreshTokenValidity()); + } + + String json = origin.getAdditionalInformation(); + if (StrUtil.isNotBlank(json)) { + try { + @SuppressWarnings("unchecked") + Map additionalInformation = JSONUtil.toBean(json, Map.class); + target.setAdditionalInformation(additionalInformation); + } + catch (Exception e) { + log.warn("Could not decode JSON for additional information: " + json, e); + } + } + + return target; } }