mirror of
https://github.com/hs-web/hsweb-framework.git
synced 2026-05-23 01:39:35 +08:00
优化异步事件
This commit is contained in:
@@ -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()));
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user