From 8a05e7dacb60b3bae8a91bc92deb3092cc83aaf0 Mon Sep 17 00:00:00 2001 From: zhou-hao Date: Mon, 20 Jul 2020 18:20:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=BC=82=E6=AD=A5=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../events/AbstractAuthorizationEvent.java | 9 ++-- .../events/AuthorizationSuccessEvent.java | 9 ++-- .../basic/web/AuthorizationController.java | 45 ++++++++++--------- .../authorization/basic/web/UserOnSignIn.java | 11 ++--- .../basic/web/UserTokenWebFilter.java | 12 ++--- .../hswebframework/web/event/AsyncEvent.java | 29 ++++++++---- .../web/event/DefaultAsyncEvent.java | 22 +++++++++ 7 files changed, 87 insertions(+), 50 deletions(-) create mode 100644 hsweb-core/src/main/java/org/hswebframework/web/event/DefaultAsyncEvent.java diff --git a/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AbstractAuthorizationEvent.java b/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AbstractAuthorizationEvent.java index 45a5a3b88..db9db2580 100644 --- a/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AbstractAuthorizationEvent.java +++ b/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AbstractAuthorizationEvent.java @@ -19,7 +19,7 @@ package org.hswebframework.web.authorization.events; -import org.springframework.context.ApplicationEvent; +import org.hswebframework.web.event.DefaultAsyncEvent; import java.util.Optional; import java.util.function.Function; @@ -30,14 +30,14 @@ import java.util.function.Function; * @author zhouhao * @since 3.0 */ -public abstract class AbstractAuthorizationEvent extends ApplicationEvent implements AuthorizationEvent { +public abstract class AbstractAuthorizationEvent extends DefaultAsyncEvent implements AuthorizationEvent { private static final long serialVersionUID = -3027505108916079214L; protected String username; protected String password; - private transient Function parameterGetter; + private final transient Function parameterGetter; /** * 所有参数不能为null @@ -47,7 +47,6 @@ public abstract class AbstractAuthorizationEvent extends ApplicationEvent implem * @param parameterGetter 参数获取函数,用户获取授权时传入的参数 */ public AbstractAuthorizationEvent(String username, String password, Function parameterGetter) { - super(username + "/" + password); if (username == null || password == null || parameterGetter == null) { throw new NullPointerException(); } @@ -57,7 +56,7 @@ public abstract class AbstractAuthorizationEvent extends ApplicationEvent implem } @SuppressWarnings("unchecked") - public Optional getParameter(String name) { + public Optional getParameter(String name) { return Optional.ofNullable((T) parameterGetter.apply(name)); } diff --git a/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationSuccessEvent.java b/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationSuccessEvent.java index 578935256..7d83af963 100644 --- a/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationSuccessEvent.java +++ b/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationSuccessEvent.java @@ -19,7 +19,7 @@ package org.hswebframework.web.authorization.events; import org.hswebframework.web.authorization.Authentication; -import org.springframework.context.ApplicationEvent; +import org.hswebframework.web.event.DefaultAsyncEvent; import java.util.HashMap; import java.util.Map; @@ -33,16 +33,15 @@ import java.util.function.Function; * @see Authentication * @since 3.0 */ -public class AuthorizationSuccessEvent extends ApplicationEvent implements AuthorizationEvent { +public class AuthorizationSuccessEvent extends DefaultAsyncEvent implements AuthorizationEvent { private static final long serialVersionUID = -2452116314154155058L; - private Authentication authentication; + private final Authentication authentication; - private transient Function parameterGetter; + private final transient Function parameterGetter; private Map result = new HashMap<>(); public AuthorizationSuccessEvent(Authentication authentication, Function parameterGetter) { - super(authentication); this.authentication = authentication; this.parameterGetter = parameterGetter; } diff --git a/hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/AuthorizationController.java b/hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/AuthorizationController.java index c18506452..1360a7fed 100644 --- a/hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/AuthorizationController.java +++ b/hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/AuthorizationController.java @@ -94,31 +94,34 @@ public class AuthorizationController { AuthorizationFailedEvent.Reason reason = AuthorizationFailedEvent.Reason.OTHER; Function parameterGetter = parameters::get; return Mono.defer(() -> { - String username = username_; - String password = password_; + AuthorizationDecodeEvent decodeEvent = new AuthorizationDecodeEvent(username_, password_, parameterGetter); + return decodeEvent + .publish(eventPublisher) + .then(Mono.defer(() -> { + String username = decodeEvent.getUsername(); + String password = decodeEvent.getPassword(); + AuthorizationBeforeEvent beforeEvent = new AuthorizationBeforeEvent(username, password, parameterGetter); + return beforeEvent + .publish(eventPublisher) + .then(authenticationManager + .authenticate(Mono.just(new PlainTextUsernamePasswordAuthenticationRequest(username, password))) + .switchIfEmpty(Mono.error(() -> new IllegalArgumentException("密码错误"))) + .flatMap(auth -> { + //触发授权成功事件 + AuthorizationSuccessEvent event = new AuthorizationSuccessEvent(auth, parameterGetter); + event.getResult().put("userId", auth.getUser().getId()); + return event + .publish(eventPublisher) + .then(Mono.fromCallable(event::getResult)); + })); - AuthorizationDecodeEvent decodeEvent = new AuthorizationDecodeEvent(username, password, parameterGetter); - eventPublisher.publishEvent(decodeEvent); - username = decodeEvent.getUsername(); - password = decodeEvent.getPassword(); - AuthorizationBeforeEvent beforeEvent = new AuthorizationBeforeEvent(username, password, parameterGetter); - eventPublisher.publishEvent(beforeEvent); - // 验证通过 - return authenticationManager - .authenticate(Mono.just(new PlainTextUsernamePasswordAuthenticationRequest(username, password))) - .switchIfEmpty(Mono.error(() -> new IllegalArgumentException("密码错误"))) - .map(auth -> { - //触发授权成功事件 - AuthorizationSuccessEvent event = new AuthorizationSuccessEvent(auth, parameterGetter); - event.getResult().put("userId", auth.getUser().getId()); - eventPublisher.publishEvent(event); - return event.getResult(); - }); + })); }).onErrorResume(err -> { AuthorizationFailedEvent failedEvent = new AuthorizationFailedEvent(username_, password_, parameterGetter, reason); failedEvent.setException(err); - eventPublisher.publishEvent(failedEvent); - return Mono.error(failedEvent.getException()); + return failedEvent + .publish(eventPublisher) + .then(Mono.error(failedEvent.getException())); }); }); diff --git a/hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/UserOnSignIn.java b/hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/UserOnSignIn.java index 4b1bc12f7..7143c2a87 100644 --- a/hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/UserOnSignIn.java +++ b/hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/UserOnSignIn.java @@ -7,6 +7,7 @@ import org.hswebframework.web.authorization.token.UserTokenHolder; import org.hswebframework.web.authorization.token.UserTokenManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; +import org.springframework.context.event.EventListener; import java.util.ArrayList; import java.util.List; @@ -21,10 +22,11 @@ import java.util.List; * @see UserTokenGenerator * @since 3.0 */ -public class UserOnSignIn implements ApplicationListener { +public class UserOnSignIn { /** * 默认到令牌类型 + * * @see UserToken#getType() * @see SessionIdUserTokenGenerator#getSupportTokenType() */ @@ -50,14 +52,14 @@ public class UserOnSignIn implements ApplicationListener new UnsupportedOperationException(tokenType)) .generate(event.getAuthentication()); //登入 - userTokenManager.signIn(newToken.getToken(), newToken.getType(), event.getAuthentication().getUser().getId(), newToken.getTimeout()) - .block(); + event.async(userTokenManager.signIn(newToken.getToken(), newToken.getType(), event.getAuthentication().getUser().getId(), newToken.getTimeout()).then()); //响应结果 event.getResult().putAll(newToken.getResponse()); diff --git a/hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/UserTokenWebFilter.java b/hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/UserTokenWebFilter.java index 0aa81f6ba..a21a4a19a 100644 --- a/hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/UserTokenWebFilter.java +++ b/hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/UserTokenWebFilter.java @@ -28,9 +28,9 @@ import java.util.Map; @Slf4j public class UserTokenWebFilter implements WebFilter, BeanPostProcessor { - private List parsers = new ArrayList<>(); + private final List parsers = new ArrayList<>(); - private Map tokenGeneratorMap = new HashMap<>(); + private final Map tokenGeneratorMap = new HashMap<>(); @Autowired private UserTokenManager userTokenManager; @@ -62,12 +62,12 @@ public class UserTokenWebFilter implements WebFilter, BeanPostProcessor { .map(String::valueOf) .map(Long::parseLong) .orElse(token.getTimeout()); + event.getResult().put("expires", expires); - userTokenManager + event.async(userTokenManager .signIn(token.getToken(), token.getType(), event.getAuthentication().getUser().getId(), expires) - .subscribe(t -> { - log.debug("user [{}] sign in", t.getUserId()); - }); + .doOnNext(t -> log.debug("user [{}] sign in", t.getUserId())) + .then()); } } diff --git a/hsweb-core/src/main/java/org/hswebframework/web/event/AsyncEvent.java b/hsweb-core/src/main/java/org/hswebframework/web/event/AsyncEvent.java index 561700215..c7c5149a7 100644 --- a/hsweb-core/src/main/java/org/hswebframework/web/event/AsyncEvent.java +++ b/hsweb-core/src/main/java/org/hswebframework/web/event/AsyncEvent.java @@ -1,16 +1,29 @@ package org.hswebframework.web.event; -import lombok.Getter; import org.reactivestreams.Publisher; +import org.springframework.context.ApplicationEventPublisher; import reactor.core.publisher.Mono; -@Getter -public class AsyncEvent { +/** + * 异步事件,使用响应式编程进行事件监听时,请使用此事件接口 + * + * @author zhouhao + * @since 4.0.5 + */ +public interface AsyncEvent { - private Mono async = Mono.empty(); - - public synchronized void async(Publisher publisher) { - this.async = async.then(Mono.from(publisher).then()); - } + /** + * 注册一个异步任务 + * + * @param publisher 异步任务 + */ + void async(Publisher publisher); + /** + * 推送事件到 ApplicationEventPublisher + * + * @param eventPublisher ApplicationEventPublisher + * @return async void + */ + Mono publish(ApplicationEventPublisher eventPublisher); } diff --git a/hsweb-core/src/main/java/org/hswebframework/web/event/DefaultAsyncEvent.java b/hsweb-core/src/main/java/org/hswebframework/web/event/DefaultAsyncEvent.java new file mode 100644 index 000000000..8a6f40db6 --- /dev/null +++ b/hsweb-core/src/main/java/org/hswebframework/web/event/DefaultAsyncEvent.java @@ -0,0 +1,22 @@ +package org.hswebframework.web.event; + +import org.reactivestreams.Publisher; +import org.springframework.context.ApplicationEventPublisher; +import reactor.core.publisher.Mono; + +public class DefaultAsyncEvent implements AsyncEvent { + + private Mono async = Mono.empty(); + + public synchronized void async(Publisher publisher) { + this.async = async.then(Mono.from(publisher).then()); + } + + @Override + public Mono publish(ApplicationEventPublisher eventPublisher) { + + eventPublisher.publishEvent(this); + + return this.async; + } +}