使用 jax-rs 和 cxf 进行客户端身份验证

Kla*_*aus 5 java cxf jax-rs jersey

我们要将 JAX-RS 实现从 Jersey 切换到 Apache CXF 3.0。我只是无法弄清楚基本身份验证是如何以 Apache CXF 方式完成的。我在 CXF 周围找到的所有示例WebClient,而不是 JAX-RS Client API。

这就是泽西岛的工作:

Client client = ClientBuilder.newClient();
client.register(HttpAuthenticationFeature.basic(config.getUsername(),config.getPassword()));
Run Code Online (Sandbox Code Playgroud)

如何使用 Apache CXF 做到这一点?

cas*_*lin 5

创建一个ClientRequestFilter来执行基本身份验证:

@Provider
public class Authenticator implements ClientRequestFilter {

    private String user;
    private String password;

    public Authenticator(String user, String password) {
        this.user = user;
        this.password = password;
    }

    @Override
    public void filter(ClientRequestContext requestContext) throws IOException {
        requestContext.getHeaders().add(
            HttpHeaders.AUTHORIZATION, getBasicAuthentication());
    }

    private String getBasicAuthentication() {
        String userAndPassword = this.user + ":" + this.password;
        byte[] userAndPasswordBytes = userAndPassword.getBytes("UTF-8");
        return "Basic " + Base64.getEncoder().encodeToString(userAndPasswordBytes);
    }
}
Run Code Online (Sandbox Code Playgroud)

并将其注册到您的Client

Client client = ClientBuilder.newClient().register(new Authenticator(user, password));
Run Code Online (Sandbox Code Playgroud)

上面的解决方案使用Java 8Base64.Encoder来执行Base64编码。
如果由于某种原因您没有使用 Java 8,您可以使用BaseEncodingGoogle Guava