From f0090f31fdcfac3279785af1fd479c5228cef6c1 Mon Sep 17 00:00:00 2001 From: wangxiang <1827945911@qq.com> Date: Mon, 16 May 2022 08:03:22 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=91=A3=20=E9=87=8D=E6=9E=84=E5=BA=95?= =?UTF-8?q?=E5=B1=82=E5=A4=9A=E7=A7=9F=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feign/config/FeignErrorDecoder.java | 50 +++++++++++++++++++ .../KiccDaoAuthenticationProvider.java | 13 +++-- .../service/KiccUserDetailsService.java | 6 +-- .../monitor/api/feign/RemoteLogService.java | 3 +- .../monitor/api/feign/RemoteTokenService.java | 3 +- .../system/api/feign/RemoteDictService.java | 5 +- .../system/api/feign/RemoteUserService.java | 3 +- .../kicc/system/controller/AppController.java | 2 +- .../system/controller/UserController.java | 2 +- 9 files changed, 70 insertions(+), 17 deletions(-) create mode 100644 kicc-common/kicc-common-feign/src/main/java/com/cloud/kicc/common/feign/config/FeignErrorDecoder.java diff --git a/kicc-common/kicc-common-feign/src/main/java/com/cloud/kicc/common/feign/config/FeignErrorDecoder.java b/kicc-common/kicc-common-feign/src/main/java/com/cloud/kicc/common/feign/config/FeignErrorDecoder.java new file mode 100644 index 00000000..d2dd52d8 --- /dev/null +++ b/kicc-common/kicc-common-feign/src/main/java/com/cloud/kicc/common/feign/config/FeignErrorDecoder.java @@ -0,0 +1,50 @@ +package com.cloud.kicc.common.feign.config; + +import com.alibaba.fastjson.JSON; +import com.cloud.kicc.common.core.api.R; +import feign.FeignException; +import feign.Response; +import feign.RetryableException; +import feign.codec.ErrorDecoder; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Configuration; + +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; + +/** + *

+ * 自定义feign错误响应数据 + *

+ * + * @Author: entfrm开发团队-王翔 + * @Date: 2022/5/16 + */ +@Slf4j +@Configuration +public class FeignErrorDecoder extends ErrorDecoder.Default { + + @Override + @SneakyThrows + public Exception decode(String methodKey, Response response) { + Exception exception = super.decode(methodKey, response); + // 如果是RetryableException,则返回继续重试 + if (exception instanceof RetryableException) { + return exception; + } + try { + // 如果是FeignException,则对其进行处理,并抛出Exception + if (exception instanceof FeignException && ((FeignException) exception).responseBody().isPresent()) { + ByteBuffer responseBody = ((FeignException) exception).responseBody().get(); + String bodyText = StandardCharsets.UTF_8.newDecoder().decode(responseBody.asReadOnlyBuffer()).toString(); + R result = JSON.parseObject(bodyText, R.class); + return new Exception(result.getMsg()); + } + } catch (Exception ex) { + log.error(ex.getMessage(), ex); + } + return exception; + } + +} diff --git a/kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/grant/provider/KiccDaoAuthenticationProvider.java b/kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/grant/provider/KiccDaoAuthenticationProvider.java index 612d3d5a..07affaee 100644 --- a/kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/grant/provider/KiccDaoAuthenticationProvider.java +++ b/kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/grant/provider/KiccDaoAuthenticationProvider.java @@ -2,6 +2,7 @@ package com.cloud.kicc.common.security.grant.provider; import cn.hutool.extra.spring.SpringUtil; import com.cloud.kicc.common.core.util.WebUtil; +import com.cloud.kicc.common.security.exception.ServerErrorException; import com.cloud.kicc.common.security.service.KiccUserDetailsService; import org.springframework.core.Ordered; import org.springframework.security.authentication.BadCredentialsException; @@ -17,6 +18,7 @@ import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.factory.PasswordEncoderFactories; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.oauth2.common.exceptions.OAuth2Exception; import org.springframework.util.Assert; import java.util.Comparator; @@ -107,16 +109,13 @@ public class KiccDaoAuthenticationProvider extends AbstractUserDetailsAuthentica "UserDetailsService returned null, which is an interface contract violation"); } return loadedUser; - } - catch (UsernameNotFoundException ex) { + } catch (UsernameNotFoundException ex) { mitigateAgainstTimingAttack(authentication); throw ex; - } - catch (InternalAuthenticationServiceException ex) { + } catch (InternalAuthenticationServiceException ex) { throw ex; - } - catch (Exception ex) { - throw new InternalAuthenticationServiceException(ex.getMessage(), ex); + } catch (Exception ex) { + throw new ServerErrorException(ex.getMessage(), ex); } } diff --git a/kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/service/KiccUserDetailsService.java b/kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/service/KiccUserDetailsService.java index 201b3d3d..951663f6 100644 --- a/kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/service/KiccUserDetailsService.java +++ b/kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/service/KiccUserDetailsService.java @@ -2,17 +2,17 @@ package com.cloud.kicc.common.security.service; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; -import com.cloud.kicc.system.api.entity.User; import com.cloud.kicc.common.core.api.R; import com.cloud.kicc.common.core.constant.CommonConstants; import com.cloud.kicc.common.core.constant.SecurityConstants; import com.cloud.kicc.common.data.entity.KiccUser; +import com.cloud.kicc.system.api.entity.User; import org.springframework.core.Ordered; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.oauth2.common.exceptions.OAuth2Exception; import java.util.Arrays; import java.util.Collection; @@ -54,7 +54,7 @@ public interface KiccUserDetailsService extends UserDetailsService, Ordered { */ default UserDetails getUserDetails(R result) { if (result == null || result.getData() == null) { - throw new UsernameNotFoundException("用户不存在"); + throw new OAuth2Exception(result.getMsg()); } User user = result.getData(); diff --git a/kicc-platform/kicc-platform-api/kicc-monitor-api/src/main/java/com/cloud/kicc/monitor/api/feign/RemoteLogService.java b/kicc-platform/kicc-platform-api/kicc-monitor-api/src/main/java/com/cloud/kicc/monitor/api/feign/RemoteLogService.java index 6bb0e4a4..cb7a00aa 100644 --- a/kicc-platform/kicc-platform-api/kicc-monitor-api/src/main/java/com/cloud/kicc/monitor/api/feign/RemoteLogService.java +++ b/kicc-platform/kicc-platform-api/kicc-monitor-api/src/main/java/com/cloud/kicc/monitor/api/feign/RemoteLogService.java @@ -4,6 +4,7 @@ import com.cloud.kicc.common.core.api.R; import com.cloud.kicc.common.core.constant.AppConstants; import com.cloud.kicc.common.core.constant.SecurityConstants; import com.cloud.kicc.common.core.constant.ServiceNameConstants; +import com.cloud.kicc.common.feign.config.FeignErrorDecoder; import com.cloud.kicc.monitor.api.entity.OperLog; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; @@ -18,7 +19,7 @@ import org.springframework.web.bind.annotation.RequestHeader; * @Author: entfrm开发团队-王翔 * @Date: 2022/2/17 */ -@FeignClient(contextId = "remoteLogService", value = ServiceNameConstants.MONITOR_SERVICE) +@FeignClient(contextId = "remoteLogService", value = ServiceNameConstants.MONITOR_SERVICE, configuration = {FeignErrorDecoder.class}) public interface RemoteLogService { /** diff --git a/kicc-platform/kicc-platform-api/kicc-monitor-api/src/main/java/com/cloud/kicc/monitor/api/feign/RemoteTokenService.java b/kicc-platform/kicc-platform-api/kicc-monitor-api/src/main/java/com/cloud/kicc/monitor/api/feign/RemoteTokenService.java index e13db1ef..ea10cab4 100644 --- a/kicc-platform/kicc-platform-api/kicc-monitor-api/src/main/java/com/cloud/kicc/monitor/api/feign/RemoteTokenService.java +++ b/kicc-platform/kicc-platform-api/kicc-monitor-api/src/main/java/com/cloud/kicc/monitor/api/feign/RemoteTokenService.java @@ -3,6 +3,7 @@ package com.cloud.kicc.monitor.api.feign; import com.cloud.kicc.common.core.api.R; import com.cloud.kicc.common.core.constant.SecurityConstants; import com.cloud.kicc.common.core.constant.ServiceNameConstants; +import com.cloud.kicc.common.feign.config.FeignErrorDecoder; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; @@ -16,7 +17,7 @@ import java.util.Map; * @Author: entfrm开发团队-王翔 * @Date: 2022/2/17 */ -@FeignClient(contextId = "remoteTokenService", value = ServiceNameConstants.AUTH_SERVICE) +@FeignClient(contextId = "remoteTokenService", value = ServiceNameConstants.AUTH_SERVICE, configuration = {FeignErrorDecoder.class}) public interface RemoteTokenService { /** diff --git a/kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/feign/RemoteDictService.java b/kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/feign/RemoteDictService.java index 097f2137..eef48298 100644 --- a/kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/feign/RemoteDictService.java +++ b/kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/feign/RemoteDictService.java @@ -1,10 +1,11 @@ package com.cloud.kicc.system.api.feign; -import com.cloud.kicc.system.api.entity.DictData; import com.cloud.kicc.common.core.api.R; import com.cloud.kicc.common.core.constant.AppConstants; import com.cloud.kicc.common.core.constant.SecurityConstants; import com.cloud.kicc.common.core.constant.ServiceNameConstants; +import com.cloud.kicc.common.feign.config.FeignErrorDecoder; +import com.cloud.kicc.system.api.entity.DictData; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -20,7 +21,7 @@ import java.util.List; * @Author: entfrm开发团队-王翔 * @Date: 2022/2/17 */ -@FeignClient(contextId = "remoteDictService", value = ServiceNameConstants.SYSTEM_SERVICE) +@FeignClient(contextId = "remoteDictService", value = ServiceNameConstants.SYSTEM_SERVICE, configuration = {FeignErrorDecoder.class}) public interface RemoteDictService { /** diff --git a/kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/feign/RemoteUserService.java b/kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/feign/RemoteUserService.java index 56d22ef8..ec6d9a36 100644 --- a/kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/feign/RemoteUserService.java +++ b/kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/feign/RemoteUserService.java @@ -1,5 +1,6 @@ package com.cloud.kicc.system.api.feign; +import com.cloud.kicc.common.feign.config.FeignErrorDecoder; import com.cloud.kicc.system.api.entity.User; import com.cloud.kicc.common.core.api.R; import com.cloud.kicc.common.core.constant.AppConstants; @@ -18,7 +19,7 @@ import org.springframework.web.bind.annotation.RequestHeader; * @Author: entfrm开发团队-王翔 * @Date: 2022/2/17 */ -@FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.SYSTEM_SERVICE) +@FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.SYSTEM_SERVICE, configuration = {FeignErrorDecoder.class}) public interface RemoteUserService { /** diff --git a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/AppController.java b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/AppController.java index 659f7f79..0c826a69 100644 --- a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/AppController.java +++ b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/AppController.java @@ -48,7 +48,7 @@ public class AppController { public R selectByPhone(@PathVariable String phone) { User user = userService.getOne(Wrappers.query().lambda().eq(User::getPhone, phone)); if (user == null) { - return R.error(String.format("用户信息为空 %s", phone)); + return R.error(String.format("找不到手机号:%s,请检查是否用户或者密码不正确!", phone)); } return R.ok(userService.getUserAuthority(user)); } diff --git a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/UserController.java b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/UserController.java index 163b4333..cd2543b7 100644 --- a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/UserController.java +++ b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/UserController.java @@ -105,7 +105,7 @@ public class UserController { public R selectByUserName(@PathVariable String userName) { User user = userService.getOne(Wrappers.query().lambda().eq(User::getUserName, userName)); if (user == null) { - return R.error(String.format("用户信息为空 %s", userName)); + return R.error(String.format("找不到用户:%s,请检查是否用户或者密码不正确!", userName)); } return R.ok(userService.getUserAuthority(user)); }