优化
This commit is contained in:
@@ -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); }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user