refactor: 优化配置

This commit is contained in:
zhouhao
2024-07-08 14:41:30 +08:00
parent 87f7f06e7d
commit f5d46643e9
15 changed files with 104 additions and 123 deletions

View File

@@ -13,7 +13,7 @@ import org.springframework.context.annotation.Configuration;
/**
* @author zhouhao
*/
@Configuration
@Configuration(proxyBeanMethods = false)
@AutoConfigureAfter(AuthorizingHandlerAutoConfiguration.class)
public class AopAuthorizeAutoConfiguration {

View File

@@ -10,6 +10,7 @@ import org.hswebframework.web.authorization.basic.handler.DefaultAuthorizingHand
import org.hswebframework.web.authorization.basic.handler.UserAllowPermissionHandler;
import org.hswebframework.web.authorization.basic.web.*;
import org.hswebframework.web.authorization.token.UserTokenManager;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -38,8 +39,14 @@ public class AuthorizingHandlerAutoConfiguration {
@Bean
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
public UserTokenWebFilter userTokenWebFilter() {
return new UserTokenWebFilter();
public UserTokenWebFilter userTokenWebFilter(UserTokenManager userTokenManager,
ObjectProvider<ReactiveUserTokenParser> tokenParsers,
ObjectProvider<ReactiveUserTokenGenerator> tokenGenerators) {
UserTokenWebFilter filter = new UserTokenWebFilter(userTokenManager);
tokenParsers.forEach(filter::register);
tokenGenerators.forEach(filter::register);
return filter;
}

View File

@@ -1,5 +1,6 @@
package org.hswebframework.web.authorization.basic.web;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.hswebframework.web.authorization.events.AuthorizationSuccessEvent;
import org.hswebframework.web.authorization.token.ParsedToken;
@@ -27,40 +28,39 @@ import java.util.List;
import java.util.Map;
import java.util.function.Function;
@Component
@Slf4j
public class UserTokenWebFilter implements WebFilter, BeanPostProcessor {
@AllArgsConstructor
public class UserTokenWebFilter implements WebFilter {
private final List<ReactiveUserTokenParser> parsers = new ArrayList<>();
private final Map<String, ReactiveUserTokenGenerator> tokenGeneratorMap = new HashMap<>();
@Autowired
private UserTokenManager userTokenManager;
private final UserTokenManager userTokenManager;
@Override
@NonNull
public Mono<Void> filter(@NonNull ServerWebExchange exchange, WebFilterChain chain) {
return Flux
.fromIterable(parsers)
.flatMap(parser -> parser.parseToken(exchange))
.next()
.map(token -> chain
.filter(exchange)
.contextWrite(Context.of(ParsedToken.class, token)))
.defaultIfEmpty(chain.filter(exchange))
.flatMap(Function.identity())
.contextWrite(ReactiveLogger.start("requestId", exchange.getRequest().getId()));
.fromIterable(parsers)
.flatMap(parser -> parser.parseToken(exchange))
.next()
.map(token -> chain
.filter(exchange)
.contextWrite(Context.of(ParsedToken.class, token)))
.defaultIfEmpty(chain.filter(exchange))
.flatMap(Function.identity())
.contextWrite(ReactiveLogger.start("requestId", exchange.getRequest().getId()));
}
@EventListener
public void handleUserSign(AuthorizationSuccessEvent event) {
ReactiveUserTokenGenerator generator = event
.<String>getParameter("tokenType")
.map(tokenGeneratorMap::get)
.orElseGet(() -> tokenGeneratorMap.get("default"));
.<String>getParameter("tokenType")
.map(tokenGeneratorMap::get)
.orElseGet(() -> tokenGeneratorMap.get("default"));
if (generator != null) {
GeneratedToken token = generator.generate(event.getAuthentication());
event.getResult().putAll(token.getResponse());
@@ -72,26 +72,23 @@ public class UserTokenWebFilter implements WebFilter, BeanPostProcessor {
.orElse(token.getTimeout());
event.getResult().put("expires", expires);
event.async(userTokenManager
.signIn(token.getToken(), token.getType(), event
.getAuthentication()
.getUser()
.getId(), expires)
.doOnNext(t -> log.debug("user [{}] sign in", t.getUserId()))
.then());
.signIn(token.getToken(), token.getType(), event
.getAuthentication()
.getUser()
.getId(), expires)
.doOnNext(t -> log.debug("user [{}] sign in", t.getUserId()))
.then());
}
}
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof ReactiveUserTokenGenerator) {
ReactiveUserTokenGenerator generator = ((ReactiveUserTokenGenerator) bean);
tokenGeneratorMap.put(generator.getTokenType(), generator);
}
if (bean instanceof ReactiveUserTokenParser) {
parsers.add(((ReactiveUserTokenParser) bean));
}
return bean;
public void register(ReactiveUserTokenGenerator generator) {
tokenGeneratorMap.put(generator.getTokenType(), generator);
}
public void register(ReactiveUserTokenParser parser) {
parsers.add(parser);
}
}