优化异步事件

This commit is contained in:
zhou-hao
2020-07-20 18:20:36 +08:00
parent e857247d45
commit 8a05e7dacb
7 changed files with 87 additions and 50 deletions

View File

@@ -94,31 +94,34 @@ public class AuthorizationController {
AuthorizationFailedEvent.Reason reason = AuthorizationFailedEvent.Reason.OTHER;
Function<String, Object> 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()));
});
});

View File

@@ -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<AuthorizationSuccessEvent> {
public class UserOnSignIn {
/**
* 默认到令牌类型
*
* @see UserToken#getType()
* @see SessionIdUserTokenGenerator#getSupportTokenType()
*/
@@ -50,14 +52,14 @@ public class UserOnSignIn implements ApplicationListener<AuthorizationSuccessEve
this.userTokenGenerators = userTokenGenerators;
}
@Override
@EventListener
public void onApplicationEvent(AuthorizationSuccessEvent event) {
UserToken token = UserTokenHolder.currentToken();
String tokenType = (String) event.getParameter("token_type").orElse(defaultTokenType);
if (token != null) {
//先退出已登陆的用户
userTokenManager.signOutByToken(token.getToken()).block();
event.async(userTokenManager.signOutByToken(token.getToken()));
}
//创建token
GeneratedToken newToken = userTokenGenerators.stream()
@@ -66,8 +68,7 @@ public class UserOnSignIn implements ApplicationListener<AuthorizationSuccessEve
.orElseThrow(() -> 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());

View File

@@ -28,9 +28,9 @@ import java.util.Map;
@Slf4j
public class UserTokenWebFilter implements WebFilter, BeanPostProcessor {
private List<ReactiveUserTokenParser> parsers = new ArrayList<>();
private final List<ReactiveUserTokenParser> parsers = new ArrayList<>();
private Map<String, ReactiveUserTokenGenerator> tokenGeneratorMap = new HashMap<>();
private final Map<String, ReactiveUserTokenGenerator> 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());
}
}