如何使用 Jnunit 5 从 Micronaut java 中的 HttpRequest 将值传递给 AuthenticationProvider
How to pass the value to the AuthenticationProvider from HttpRequest in Micronaut java with Jnunit 5
使用 Micronaut HttpClient 在 Junit 5 测试中执行 HTTP 调用。
我正在尝试使用 HttpRequest 将值传递给 AuthenticationProvider,如下所示
@MicronautTest
public class ProductCreateTest extends TestContainerFixture {
@Inject
@Client("/")
HttpClient client;
@Test
@DisplayName("Should create the product")
void shouldCreateTheProduct() {
HttpRequest request = HttpRequest.POST("/product", new ProductModel())
.bearerAuth(bearerAccessRefreshToken.getAccessToken());
request.setAttribute("fb_product", "owner");
HttpResponse < ProductModel > rsp = client.toBlocking().exchange(request, ProductModel.class);
var item = rsp.body();
}
}
这里我将一个属性设置为 request.setAttribute("fb_product", "owner");
并且在身份验证提供程序中我正尝试按如下方式访问该属性
@Singleton
@Requires(env = Environment.TEST)
public record AuthenticationProviderFixture(Configuration configuration) implements AuthenticationProvider {
@Override
public Publisher<AuthenticationResponse> authenticate(HttpRequest<?> httpRequest, AuthenticationRequest<?, ?> authenticationRequest) {
return Flux.create(emitter -> {
if (authenticationRequest.getIdentity().equals(configuration.Username()) && authenticationRequest.getSecret().equals(configuration.Password())) {
var attributeValue = httpRequest.getAttribute("fb_product");
HashMap<String, Object> attributes = new HashMap<>();
emitter.next(AuthenticationResponse.success((String) authenticationRequest.getIdentity(), attributes));
emitter.complete();
} else {
emitter.error(AuthenticationResponse.exception());
}
}, FluxSink.OverflowStrategy.ERROR);
}
}
属性未映射,这提供了一个空值 var attributeValue = httpRequest.getAttribute("fb_product");
将数据从 HttpRequest 传递到 AuthenticationProvider 的最佳方法是什么
有令牌生成器的概念,但是安全规则上有令牌生成器,认证无效。
注入 TokenGenerator
并创建一个令牌
Map<String, Object> claims = new HashMap<>();
claims.put("fb_product","owner");
var claimGenerator = tokenGenerator.generateToken(claims);
要向请求添加 header:
HttpRequest request = HttpRequest.POST("/product", new ProductModel())
.bearerAuth(bearerAccessRefreshToken.getAccessToken())
.header("fb_product", "owner");
检索 header:
Optional<String> fbOwner = request.getHeaders().findFirst("fb_owner");
您没有在 HTTP 客户端请求中设置属性。
你想达到什么目的?模拟正在登录的用户?
使用 Micronaut HttpClient 在 Junit 5 测试中执行 HTTP 调用。
我正在尝试使用 HttpRequest 将值传递给 AuthenticationProvider,如下所示
@MicronautTest
public class ProductCreateTest extends TestContainerFixture {
@Inject
@Client("/")
HttpClient client;
@Test
@DisplayName("Should create the product")
void shouldCreateTheProduct() {
HttpRequest request = HttpRequest.POST("/product", new ProductModel())
.bearerAuth(bearerAccessRefreshToken.getAccessToken());
request.setAttribute("fb_product", "owner");
HttpResponse < ProductModel > rsp = client.toBlocking().exchange(request, ProductModel.class);
var item = rsp.body();
}
}
这里我将一个属性设置为 request.setAttribute("fb_product", "owner");
并且在身份验证提供程序中我正尝试按如下方式访问该属性
@Singleton
@Requires(env = Environment.TEST)
public record AuthenticationProviderFixture(Configuration configuration) implements AuthenticationProvider {
@Override
public Publisher<AuthenticationResponse> authenticate(HttpRequest<?> httpRequest, AuthenticationRequest<?, ?> authenticationRequest) {
return Flux.create(emitter -> {
if (authenticationRequest.getIdentity().equals(configuration.Username()) && authenticationRequest.getSecret().equals(configuration.Password())) {
var attributeValue = httpRequest.getAttribute("fb_product");
HashMap<String, Object> attributes = new HashMap<>();
emitter.next(AuthenticationResponse.success((String) authenticationRequest.getIdentity(), attributes));
emitter.complete();
} else {
emitter.error(AuthenticationResponse.exception());
}
}, FluxSink.OverflowStrategy.ERROR);
}
}
属性未映射,这提供了一个空值 var attributeValue = httpRequest.getAttribute("fb_product");
将数据从 HttpRequest 传递到 AuthenticationProvider 的最佳方法是什么
有令牌生成器的概念,但是安全规则上有令牌生成器,认证无效。
注入 TokenGenerator
并创建一个令牌
Map<String, Object> claims = new HashMap<>();
claims.put("fb_product","owner");
var claimGenerator = tokenGenerator.generateToken(claims);
要向请求添加 header:
HttpRequest request = HttpRequest.POST("/product", new ProductModel())
.bearerAuth(bearerAccessRefreshToken.getAccessToken())
.header("fb_product", "owner");
检索 header:
Optional<String> fbOwner = request.getHeaders().findFirst("fb_owner");
您没有在 HTTP 客户端请求中设置属性。
你想达到什么目的?模拟正在登录的用户?