Browse Source

网关服务feign错误

yingp 7 years ago
parent
commit
23760170b6

+ 1 - 1
base-servers/account/account-api/src/main/java/com/usoftchina/saas/account/cache/AccountCache.java

@@ -38,7 +38,7 @@ public class AccountCache extends RedisHashCache<String, String, String> {
 
     @Override
     protected String key() {
-        return generateKey("account", "account");
+        return generatePublicKey("account", "account");
     }
 
     @Override

+ 1 - 1
base-servers/account/account-api/src/main/java/com/usoftchina/saas/account/cache/ResourceCache.java

@@ -40,7 +40,7 @@ public class ResourceCache extends RedisHashCache<String, String, String> {
 
     @Override
     protected String key() {
-        return generateKey("account", "resource");
+        return generatePublicKey("account", "resource");
     }
 
     @Override

+ 1 - 1
base-servers/account/account-server/src/main/resources/application.yml

@@ -50,7 +50,7 @@ eureka:
   client:
     registryFetchIntervalSeconds: 5
     serviceUrl:
-      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.0.181:8510/eureka/
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8500/eureka/
 server:
   port: 8580
   tomcat:

+ 2 - 1
base-servers/auth/auth-client/src/main/java/com/usoftchina/saas/auth/client/interceptor/AuthRestInterceptor.java

@@ -44,7 +44,8 @@ public class AuthRestInterceptor extends HandlerInterceptorAdapter {
                 BaseContextHolder.setUserId(infoFromToken.getUserId());
                 BaseContextHolder.setCompanyId(infoFromToken.getCompanyId());
                 BaseContextHolder.setToken(token);
-                log.info("token={} \\r\\n userName={}", token, infoFromToken.getUserName());
+                log.info("request={} token={} \\r\\n userName={}", request.getRequestURI(),
+                        token, infoFromToken.getUserName());
             }
         } else {
             // no mapping

+ 21 - 12
base-servers/gateway-server/src/main/java/com/usoftchina/saas/gateway/config/AuthFilter.java

@@ -6,6 +6,7 @@ import com.usoftchina.saas.account.dto.AccountDTO;
 import com.usoftchina.saas.account.dto.UrlResourceDTO;
 import com.usoftchina.saas.auth.common.jwt.JwtHelper;
 import com.usoftchina.saas.auth.common.jwt.JwtInfo;
+import com.usoftchina.saas.context.BaseContextHolder;
 import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.exception.ExceptionCode;
 import com.usoftchina.saas.gateway.error.PermissionException;
@@ -40,17 +41,26 @@ public class AuthFilter implements GlobalFilter, Ordered {
 
     @Override
     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
-        if (!isIgnore(exchange.getRequest())) {
-            // 鉴别身份信息
-            JwtInfo jwt = getJwtInfoFromHeader(exchange.getRequest());
-            AccountDTO accountDTO = AccountCache.of(jwt.getUserId()).getAccount();
-            if (null == accountDTO) {
-                throw new BizException(ExceptionCode.USER_NOT_EXIST);
+        try {
+            if (!isIgnore(exchange.getRequest())) {
+                // 鉴别身份信息
+                String token = getAuthHeaderToken(exchange.getRequest());
+                JwtInfo jwt = JwtHelper.getInfoFromToken(token, authConfig.getPublicKey());
+                BaseContextHolder.setAppId(jwt.getAppId());
+                BaseContextHolder.setUserId(jwt.getUserId());
+                BaseContextHolder.setCompanyId(jwt.getCompanyId());
+                BaseContextHolder.setToken(token);
+                AccountDTO accountDTO = AccountCache.of(jwt.getUserId()).getAccount();
+                if (null == accountDTO) {
+                    throw new BizException(ExceptionCode.USER_NOT_EXIST);
+                }
+                // 鉴别角色权限
+                checkPermission(exchange.getRequest(), jwt, accountDTO);
             }
-            // 鉴别角色权限
-            checkPermission(exchange.getRequest(), jwt, accountDTO);
+            return chain.filter(exchange);
+        } finally {
+            BaseContextHolder.remove();
         }
-        return chain.filter(exchange);
     }
 
     /**
@@ -97,7 +107,7 @@ public class AuthFilter implements GlobalFilter, Ordered {
         return authConfig.getIgnores().stream().anyMatch(ignore -> ignore.equals(path));
     }
 
-    private JwtInfo getJwtInfoFromHeader(ServerHttpRequest request) {
+    private String getAuthHeaderToken(ServerHttpRequest request) {
         if (!request.getHeaders().containsKey(authConfig.getAuthHeader())) {
             throw new BizException(ExceptionCode.JWT_ILLEGAL_ARGUMENT);
         }
@@ -105,8 +115,7 @@ public class AuthFilter implements GlobalFilter, Ordered {
         if (headers.isEmpty()) {
             throw new BizException(ExceptionCode.JWT_ILLEGAL_ARGUMENT);
         }
-        String token = headers.get(0).trim();
-        return JwtHelper.getInfoFromToken(token, authConfig.getPublicKey());
+        return headers.get(0).trim();
     }
 
     @Override

+ 6 - 0
base-servers/gateway-server/src/main/java/com/usoftchina/saas/gateway/config/WebConfig.java

@@ -1,5 +1,6 @@
 package com.usoftchina.saas.gateway.config;
 
+import com.usoftchina.saas.gateway.interceptor.ServiceFeignInterceptor;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.http.HttpHeaders;
@@ -46,4 +47,9 @@ public class WebConfig {
             return chain.filter(ctx);
         };
     }
+	
+	@Bean
+    public ServiceFeignInterceptor serviceFeignInterceptor() {
+        return new ServiceFeignInterceptor();
+    }
 }

+ 16 - 2
framework/core/src/main/java/com/usoftchina/saas/cache/BaseRedisCache.java

@@ -101,17 +101,31 @@ public abstract class BaseRedisCache<K, V> implements Cache<V> {
     }
 
     /**
-     * 产生key
+     * 产生key (每个应用会不一样)
      * 规则:[env profile]:[application name]:[business key]
      *
      * @param values
      * @return
      */
-    protected String generateKey(CharSequence... values) {
+    protected String generatePrivateKey(CharSequence... values) {
         return new StringJoiner(":")
                 .add(SpringContextHolder.getActiveProfile())
                 .add(SpringContextHolder.getApplicationName())
                 .add(String.join(":", values))
                 .toString();
     }
+
+    /**
+     * 产生key (所有应用一样)
+     * 规则:[env profile]:[business key]
+     *
+     * @param values
+     * @return
+     */
+    protected String generatePublicKey(CharSequence... values) {
+        return new StringJoiner(":")
+                .add(SpringContextHolder.getActiveProfile())
+                .add(String.join(":", values))
+                .toString();
+    }
 }