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));
}