2.1 概述

Quarkus 是一个基于 Java 的框架,主要用于构建 Jakarta EEMicroProfile 应用,尤其擅长开发 REST 服务。为简化 REST 服务访问,Quarkus 提供了 REST 客户端,允许通过类型安全的代理对象调用 REST 服务。

⚠️ 当 REST 资源受保护时,必须进行身份认证。在 REST/HTTP 中通常通过发送包含凭据的 HTTP 头实现。但 REST 客户端 API 本身并未提供直接设置安全信息或 HTTP 头的方法。

本教程将介绍如何通过 Quarkus(MicroProfile)REST 客户端访问受保护的 REST 服务。Quarkus 为基本认证提供了简单解决方案:@ClientBasicAuth 注解

2.2 搭建受保护的服务

首先用 Quarkus 搭建一个受保护的服务

考虑以下 REST 服务接口:

@Path("/hello")
@RequestScoped
public interface MyService {

    @GET
    @Produces(TEXT_PLAIN)
    String hello();
}

实现 MyService

public class MyServiceImpl implements MyService {

    @Override
    @RolesAllowed("admin")
    public String hello() {
        return "Hello from Quarkus REST";
    }
}

❌ 注意:@RolesAllowed 注解必须放在实现类而非接口上——该注解不会从接口继承。不过这也有合理性:角色名称可视为内部细节,不应暴露。

启用安全后,Quarkus 默认激活基本认证机制,但需提供 身份存储(Quarkus 中称 IdentityProvider)。通过在 classpath 添加依赖实现,例如在 pom.xml 中加入:

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-elytron-security-properties-file</artifactId>
</dependency>

✅ 该依赖会激活安全机制(通过其传递依赖 io.quarkus:quarkus-elytron-security),并在 classpath 中提供身份存储。通过 application.properties 添加用户配置:

quarkus.http.auth.basic=true
quarkus.security.users.embedded.enabled=true
quarkus.security.users.embedded.plain-text=true

quarkus.security.users.embedded.users.john=secret1
quarkus.security.users.embedded.roles.john=admin,user

2.3 RestClientBuilder 与 @ClientBasicAuth

现在看如何通过 RestClientBuilder 调用受保护服务

以下是无凭据的类型安全调用:

MyService myService = RestClientBuilder.newBuilder()
  .baseUri(URI.create("http://localhost:8081"))
  .build(MyService.class);

 myService.hello();

这段代码会创建 REST 服务代理,调用方式如同本地方法。

提供凭据的常规方案有两种:

  1. @ClientHeaderParam 注解原始接口
  2. 继承接口并在子接口添加注解

两种方式都需通过注解指定的回调方法手动生成正确头信息。对于基本认证,更推荐使用 @ClientBasicAuth 注解

使用 @ClientBasicAuth 提供用户名/密码时,需为特定用户创建专用接口类型。用户名和密码是静态的,每个类型对应固定用户——适合使用静态定义的系统账户访问远程服务的场景。

创建专用接口:

@ClientBasicAuth(username = "john", password = "secret1")
public interface MyServiceJohnRightCredentials extends MyService {
}

调用时改用带凭据的接口类型:

MyService myService = RestClientBuilder.newBuilder()
  .baseUri(URI.create("http://localhost:8081"))
  .build(MyServiceJohnRightCredentials.class);

myService.hello();

上述代码中,Quarkus RestClientBuilder 会自动生成基本认证所需的 HTTP 头。实际项目中,可通过 ${john.password} 等表达式引用配置属性。

2.4 总结

本文介绍了:

  • 如何搭建受基本认证保护的 REST 服务
  • 如何使用 @ClientBasicAuth 注解访问这类服务

关键点: ✅ @ClientBasicAuth 无需修改原始 REST 接口
❌ 但仅支持静态预定义用户,不适用于动态凭据场景

所有代码示例可在 GitHub 获取。


原始标题:Using @ClientBasicAuth in Quarkus REST Client | Baeldung