This commit is contained in:
2026-09-29 18:47:37 +08:00
parent 2c60a29e0f
commit c2927ab9a6
291 changed files with 4008 additions and 6298 deletions
@@ -0,0 +1,58 @@
package com.baiyue.gateway.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.net.httpserver.HttpServer;
import org.junit.jupiter.api.Test;
import org.springframework.data.redis.core.ReactiveStringRedisTemplate;
import org.springframework.mock.http.server.reactive.MockServerHttpRequest;
import org.springframework.mock.web.server.MockServerWebExchange;
import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
import org.springframework.test.util.ReflectionTestUtils;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
class RedisTokenSessionWebFilterTest {
@Test void checksAuthorityAsynchronouslyAndFailsClosed() throws Exception {
var response = new AtomicReference<>("{\"code\":\"200\",\"data\":true}");
var bearer = new AtomicReference<String>();
var server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0);
server.createContext("/validate", exchange -> {
bearer.set(exchange.getRequestHeaders().getFirst("Authorization"));
byte[] bytes = response.get().getBytes(StandardCharsets.UTF_8);
exchange.getResponseHeaders().add("Content-Type", "application/json");
exchange.sendResponseHeaders(200, bytes.length); exchange.getResponseBody().write(bytes); exchange.close();
});
server.start();
var filter = new RedisTokenSessionWebFilter();
var redis = mock(ReactiveStringRedisTemplate.class);
when(redis.hasKey("test:access:jti")).thenReturn(Mono.just(true));
ReflectionTestUtils.setField(filter, "reactiveStringRedisTemplate", redis);
ReflectionTestUtils.setField(filter, "properties", new GatewaySecurityProperties(null, "issuer", "aud", "test", List.of()));
ReflectionTestUtils.setField(filter, "objectMapper", new ObjectMapper());
ReflectionTestUtils.setField(filter, "validationUri", "http://127.0.0.1:" + server.getAddress().getPort() + "/validate");
ReflectionTestUtils.setField(filter, "internalToken", "internal");
try {
for (boolean accepted : new boolean[]{true, false}) {
response.set("{\"code\":\"200\",\"data\":" + accepted + "}");
var jwt = Jwt.withTokenValue("token").header("alg", "RS256").claim("jti", "jti").claim("user_id", 1L).build();
var exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/api/platform/orders"))
.mutate().principal(Mono.just(new JwtAuthenticationToken(jwt))).build();
var invoked = new AtomicBoolean();
StepVerifier.create(filter.filter(exchange, request -> { invoked.set(true); return Mono.empty(); }))
.expectComplete().verify(Duration.ofSeconds(5));
assertThat(invoked.get()).isEqualTo(accepted);
if (!accepted) assertThat(exchange.getResponse().getStatusCode().value()).isEqualTo(401);
assertThat(bearer.get()).isNull();
}
} finally { server.stop(0); }
}
}