代码结构优化

This commit is contained in:
zhou-hao
2021-07-29 16:39:48 +08:00
parent 1a456899e2
commit ed5e3b0751
15 changed files with 213 additions and 71 deletions

View File

@@ -27,6 +27,7 @@ import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import javax.annotation.Nonnull;
import java.util.List;
/**
@@ -85,6 +86,11 @@ public class AuthorizingHandlerAutoConfiguration {
return new UserOnSignOut(userTokenManager);
}
@SuppressWarnings("all")
@ConfigurationProperties(prefix = "hsweb.authorize.token.default")
public ServletUserTokenGenPar servletUserTokenGenPar(){
return new ServletUserTokenGenPar();
}
@Bean
@ConditionalOnMissingBean(UserTokenParser.class)
@@ -101,11 +107,10 @@ public class AuthorizingHandlerAutoConfiguration {
@ConditionalOnProperty(prefix = "hsweb.authorize.two-factor", name = "enable", havingValue = "true")
@Order(100)
public WebMvcConfigurer twoFactorHandlerConfigurer(TwoFactorValidatorManager manager) {
return new WebMvcConfigurerAdapter() {
return new WebMvcConfigurer() {
@Override
public void addInterceptors(InterceptorRegistry registry) {
public void addInterceptors(@Nonnull InterceptorRegistry registry) {
registry.addInterceptor(new TwoFactorHandlerInterceptorAdapter(manager));
super.addInterceptors(registry);
}
};
}

View File

@@ -3,7 +3,7 @@ package org.hswebframework.web.authorization.basic.web;
import org.hswebframework.web.authorization.token.ParsedToken;
/**
* 已完成认证的令牌,如果返回此令牌,将直接使用{@link this#getUserId()}来绑定用户信息
* 已完成认证的令牌,如果返回此令牌,将直接使用{@link AuthorizedToken#getUserId()}来绑定用户信息
*
* @author zhouhao
*/

View File

@@ -0,0 +1,66 @@
package org.hswebframework.web.authorization.basic.web;
import lombok.Getter;
import lombok.Setter;
import org.hswebframework.web.authorization.Authentication;
import org.hswebframework.web.authorization.token.ParsedToken;
import org.hswebframework.web.id.IDGenerator;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import java.util.Collections;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
@Getter
@Setter
public class ServletUserTokenGenPar implements UserTokenParser, UserTokenGenerator {
private long timeout = TimeUnit.MINUTES.toMillis(30);
private String headerName = "X-Access-Token";
@Override
public String getSupportTokenType() {
return "default";
}
@Override
public GeneratedToken generate(Authentication authentication) {
String token = IDGenerator.MD5.generate();
return new GeneratedToken() {
@Override
public Map<String, Object> getResponse() {
return Collections.singletonMap("expires", timeout);
}
@Override
public String getToken() {
return token;
}
@Override
public String getType() {
return getSupportTokenType();
}
@Override
public long getTimeout() {
return timeout;
}
};
}
@Override
public ParsedToken parseToken(HttpServletRequest request) {
String token = Optional
.ofNullable(request.getHeader(headerName))
.orElseGet(() -> request.getParameter(":X_Access_Token"));
if (StringUtils.hasText(token)) {
return ParsedToken.of(getSupportTokenType(), token);
}
return null;
}
}

View File

@@ -5,12 +5,13 @@ import org.hswebframework.web.authorization.token.UserToken;
import org.hswebframework.web.authorization.token.UserTokenHolder;
import org.hswebframework.web.authorization.token.UserTokenManager;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.EventListener;
/**
* @author zhouhao
*/
public class UserOnSignOut implements ApplicationListener<AuthorizationExitEvent> {
private UserTokenManager userTokenManager;
public class UserOnSignOut {
private final UserTokenManager userTokenManager;
public UserOnSignOut(UserTokenManager userTokenManager) {
this.userTokenManager = userTokenManager;
@@ -21,8 +22,8 @@ public class UserOnSignOut implements ApplicationListener<AuthorizationExitEven
return null != token ? token.getToken() : "";
}
@Override
@EventListener
public void onApplicationEvent(AuthorizationExitEvent event) {
userTokenManager.signOutByToken(geToken());
event.async(userTokenManager.signOutByToken(geToken()));
}
}

View File

@@ -24,6 +24,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
@Component
@Slf4j
@@ -40,13 +41,28 @@ public class UserTokenWebFilter implements WebFilter, BeanPostProcessor {
@NonNull
public Mono<Void> filter(@NonNull ServerWebExchange exchange, WebFilterChain chain) {
return chain.filter(exchange)
.subscriberContext(ContextUtils.acceptContext(ctx ->
Flux.fromIterable(parsers)
.flatMap(parser -> parser.parseToken(exchange))
.subscribe(token -> ctx.put(ParsedToken.class, token))))
.subscriberContext(ReactiveLogger.start("requestId", exchange.getRequest().getId()))
;
return Flux
.fromIterable(parsers)
.flatMap(parser -> parser.parseToken(exchange))
.next()
.map(token -> chain
.filter(exchange)
.subscriberContext(
ContextUtils.acceptContext(
context -> context.put(ParsedToken.class, token)
)
))
.defaultIfEmpty(chain.filter(exchange))
.flatMap(Function.identity())
.subscriberContext(ReactiveLogger.start("requestId", exchange.getRequest().getId()));
// return chain.filter(exchange)
// .subscriberContext(ContextUtils.acceptContext(ctx ->
// Flux.fromIterable(parsers)
// .flatMap(parser -> parser.parseToken(exchange))
// .subscribe(token -> ctx.put(ParsedToken.class, token)))
// )
// .subscriberContext(ReactiveLogger.start("requestId", exchange.getRequest().getId()))
}
@EventListener
@@ -60,14 +76,17 @@ public class UserTokenWebFilter implements WebFilter, BeanPostProcessor {
if (StringUtils.hasText(token.getToken())) {
event.getResult().put("token", token.getToken());
long expires = event.getParameter("expires")
.map(String::valueOf)
.map(Long::parseLong)
.orElse(token.getTimeout());
.map(String::valueOf)
.map(Long::parseLong)
.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());
}
}

View File

@@ -22,27 +22,31 @@ import java.util.stream.Collectors;
*/
public class WebUserTokenInterceptor extends HandlerInterceptorAdapter {
private UserTokenManager userTokenManager;
private final UserTokenManager userTokenManager;
private List<UserTokenParser> userTokenParser;
private final List<UserTokenParser> userTokenParser;
private AopMethodAuthorizeDefinitionParser parser;
private final AopMethodAuthorizeDefinitionParser parser;
private boolean enableBasicAuthorization = false;
private final boolean enableBasicAuthorization;
public WebUserTokenInterceptor(UserTokenManager userTokenManager, List<UserTokenParser> userTokenParser, AopMethodAuthorizeDefinitionParser definitionParser) {
public WebUserTokenInterceptor(UserTokenManager userTokenManager,
List<UserTokenParser> userTokenParser,
AopMethodAuthorizeDefinitionParser definitionParser) {
this.userTokenManager = userTokenManager;
this.userTokenParser = userTokenParser;
this.parser = definitionParser;
enableBasicAuthorization = userTokenParser.stream()
enableBasicAuthorization = userTokenParser
.stream()
.filter(UserTokenForTypeParser.class::isInstance)
.anyMatch(parser -> "basic".equalsIgnoreCase(((UserTokenForTypeParser) parser).getTokenType()));
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
List<ParsedToken> tokens = userTokenParser.stream()
List<ParsedToken> tokens = userTokenParser
.stream()
.map(parser -> parser.parseToken(request))
.filter(Objects::nonNull)
.collect(Collectors.toList());
@@ -68,7 +72,8 @@ public class WebUserTokenInterceptor extends HandlerInterceptorAdapter {
userTokenManager.signOutByToken(token).subscribe();
userToken = userTokenManager
.signIn(parsedToken.getToken(), parsedToken.getType(), ((AuthorizedToken) parsedToken).getUserId(), ((AuthorizedToken) parsedToken).getMaxInactiveInterval())
.signIn(parsedToken.getToken(), parsedToken.getType(), ((AuthorizedToken) parsedToken).getUserId(), ((AuthorizedToken) parsedToken)
.getMaxInactiveInterval())
.block();
}
if (null != userToken) {