package cc.mrbird.febs.gateway.enhance.auth; import cc.mrbird.febs.common.core.entity.constant.FebsConstant; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextImpl; import org.springframework.security.web.server.context.ServerSecurityContextRepository; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; /** * @author MrBird */ @Component @RequiredArgsConstructor public class SecurityContextRepository implements ServerSecurityContextRepository { private final AuthenticationManager authenticationManager; @Override public Mono save(ServerWebExchange serverWebExchange, SecurityContext securityContext) { throw new UnsupportedOperationException("ζš‚δΈζ”―ζŒ"); } @Override public Mono load(ServerWebExchange serverWebExchange) { ServerHttpRequest request = serverWebExchange.getRequest(); String authHeader = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION); if (StringUtils.isNotBlank(authHeader) && StringUtils.startsWith(authHeader, FebsConstant.OAUTH2_TOKEN_TYPE)) { String authToken = StringUtils.substringAfter(authHeader, FebsConstant.OAUTH2_TOKEN_TYPE).trim(); Authentication auth = new UsernamePasswordAuthenticationToken(authToken, authToken); return this.authenticationManager.authenticate(auth).map(SecurityContextImpl::new); } else { return Mono.empty(); } } }