Bläddra i källkod

优化访问日志用户信息获取

zhouhao 3 år sedan
förälder
incheckning
3b8913c317

+ 4 - 9
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/ReactiveTokenAuthenticationSupplier.java

@@ -20,15 +20,10 @@ public class ReactiveTokenAuthenticationSupplier implements ReactiveAuthenticati
 
     @Override
     public Mono<Authentication> get() {
-        return ContextUtils
-                .reactiveContext()
-                .flatMap(context -> context
-                        .get(ContextKey.of(ParsedToken.class))
+        return Mono
+                .deferWithContext(context -> context
+                        .<ParsedToken>getOrEmpty(ParsedToken.class)
                         .map(t -> tokenManager.getByToken(t.getToken()))
-                        .orElseGet(Mono::empty))
-                .flatMap(auth -> ReactiveLogger
-                        .mdc("userId", auth.getUser().getId(),
-                             "username", auth.getUser().getName())
-                        .thenReturn(auth));
+                        .orElse(Mono.empty()));
     }
 }

+ 4 - 9
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/UserTokenReactiveAuthenticationSupplier.java

@@ -68,10 +68,9 @@ public class UserTokenReactiveAuthenticationSupplier implements ReactiveAuthenti
 
     @Override
     public Mono<Authentication> get() {
-        return ContextUtils
-                .reactiveContext()
-                .flatMap(context -> context
-                        .get(ContextKey.of(ParsedToken.class))
+        return Mono
+                .deferWithContext(context -> context
+                        .<ParsedToken>getOrEmpty(ParsedToken.class)
                         .map(t -> userTokenManager
                                 .getByToken(t.getToken())
                                 .filter(UserToken::validate)
@@ -82,11 +81,7 @@ public class UserTokenReactiveAuthenticationSupplier implements ReactiveAuthenti
                                     }
                                     return before.then(get(thirdPartAuthenticationManager.get(token.getType()), token.getUserId()));
                                 }))
-                        .orElseGet(Mono::empty))
-                .flatMap(auth -> ReactiveLogger
-                        .mdc("userId", auth.getUser().getId(),
-                             "username", auth.getUser().getName())
-                        .thenReturn(auth))
+                        .orElse(Mono.empty()))
                 ;
 
     }

+ 2 - 5
hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/UserTokenWebFilter.java

@@ -19,6 +19,7 @@ import org.springframework.web.server.WebFilter;
 import org.springframework.web.server.WebFilterChain;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
+import reactor.util.context.Context;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -47,11 +48,7 @@ public class UserTokenWebFilter implements WebFilter, BeanPostProcessor {
                 .next()
                 .map(token -> chain
                         .filter(exchange)
-                        .subscriberContext(
-                                ContextUtils.acceptContext(
-                                        context -> context.put(ParsedToken.class, token)
-                                )
-                        ))
+                        .subscriberContext(Context.of(ParsedToken.class, token)))
                 .defaultIfEmpty(chain.filter(exchange))
                 .flatMap(Function.identity())
                 .subscriberContext(ReactiveLogger.start("requestId", exchange.getRequest().getId()));

+ 15 - 2
hsweb-logging/hsweb-access-logging-aop/src/main/java/org/hswebframework/web/logging/aop/ReactiveAopAccessLoggerSupport.java

@@ -2,6 +2,7 @@ package org.hswebframework.web.logging.aop;
 
 import org.aopalliance.intercept.MethodInterceptor;
 import org.hswebframework.web.aop.MethodInterceptorHolder;
+import org.hswebframework.web.authorization.Authentication;
 import org.hswebframework.web.id.IDGenerator;
 import org.hswebframework.web.logger.ReactiveLogger;
 import org.hswebframework.web.logging.RequestInfo;
@@ -83,7 +84,19 @@ public class ReactiveAopAccessLoggerSupport extends StaticMethodMatcherPointcutA
                 .then(Mono.defer(() -> {
                     AccessLoggerBeforeEvent event = new AccessLoggerBeforeEvent(loggerInfo);
                     event.first(cache);
-                    return event.publish(eventPublisher);
+                    return Authentication
+                            .currentReactive()
+                            .flatMap(auth -> {
+                                loggerInfo.putContext("userId", auth.getUser().getId());
+                                loggerInfo.putContext("username", auth.getUser().getUsername());
+                                loggerInfo.putContext("userName", auth.getUser().getName());
+                                return ReactiveLogger
+                                        .mdc("userId", auth.getUser().getId(),
+                                             "username", auth.getUser().getUsername(),
+                                             "userName", auth.getUser().getName())
+                                        .thenReturn(auth);
+                            })
+                            .then(event.publish(eventPublisher));
                 }))
                 .then(Mono.defer(() -> {
                     loggerInfo.setResponseTime(System.currentTimeMillis());
@@ -166,7 +179,7 @@ public class ReactiveAopAccessLoggerSupport extends StaticMethodMatcherPointcutA
 
     @Override
     public int getOrder() {
-        return Ordered.HIGHEST_PRECEDENCE;
+        return Ordered.LOWEST_PRECEDENCE;
     }
 
     @Override

+ 19 - 1
hsweb-logging/hsweb-access-logging-api/src/main/java/org/hswebframework/web/logging/AccessLoggerInfo.java

@@ -7,6 +7,7 @@ import java.io.PrintWriter;
 import java.io.Serializable;
 import java.io.StringWriter;
 import java.lang.reflect.Method;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.StringJoiner;
@@ -115,7 +116,10 @@ public class AccessLoggerInfo {
             Class<?>[] parameterTypes = method.getParameterTypes();
 
             for (int i = 0; i < parameterTypes.length; i++) {
-                methodAppender.add(parameterTypes[i].getSimpleName().concat(" ").concat(parameterNames.length > i ? parameterNames[i] : ("arg" + i)));
+                methodAppender.add(parameterTypes[i]
+                                           .getSimpleName()
+                                           .concat(" ")
+                                           .concat(parameterNames.length > i ? parameterNames[i] : ("arg" + i)));
             }
             map.put("method", methodAppender.toString());
         }
@@ -153,4 +157,18 @@ public class AccessLoggerInfo {
         setUrl(info.getPath());
         setContext(info.getContext());
     }
+
+    public void putContext(Map<String,String> context) {
+        if (this.context == null) {
+            this.context = new HashMap<>();
+        }
+        this.context.putAll(context);
+    }
+
+    public void putContext(String key, Object value) {
+        if (this.context == null) {
+            this.context = new HashMap<>();
+        }
+        this.context.put(key, String.valueOf(value));
+    }
 }