【问题标题】:Is there any way with apache httpclient to set credentials based of a URIapache httpclient 有什么方法可以根据 URI 设置凭据
【发布时间】:2012-08-09 20:18:58
【问题描述】:

目前我有一些使用 resteasy 调用的 uris,看起来像这样:

http://host.com/api/project1/getsomestuff

http://host.com/api/project2/getsomestuff

两者都使用摘要式身份验证,但需要不同的用户名和密码进行身份验证。目前在代码中,我必须通过为每个项目创建不同的客户端实例来处理这个问题,如下所示:

DefaultHttpClient project1Client = new DefaultHttpClient();
Credentials project1Credentials = new UsernamePasswordCredentials("user1", "password1");
project1Client.getCredentialsProvider().setCredentials(AuthScope.ANY, project1Credentials);
ClientExecutor executor1 = new ApacheHttpClient4Executor(project1Client);
MyService project1Proxy = ProxyFactory.create(MyService.class, executor1);
project1Proxy.getSomeStuff("project1");

DefaultHttpClient project2Client = new DefaultHttpClient();
Credentials project2Credentials = new UsernamePasswordCredentials("user2", "password2");
project2Client.getCredentialsProvider().setCredentials(AuthScope.ANY, project1Credentials);
ClientExecutor executor2 = new ApacheHttpClient4Executor(project1Client);
MyService project2Proxy = ProxyFactory.create(MyService.class, executor2);
project2Proxy.getSomeStuff("project2");

我查看了 AuthScope 和 CredentialsProvider,但我看不出这怎么可能。有谁知道使用同一客户端使用两组凭据的任何方法,还是我被多个客户端卡住了?

另外,请注意,我不控制此 rest 调用的服务器端,并且两个调用使用相同的领域,因此我无法为每个领域设置不同的凭据。

【问题讨论】:

    标签: java resteasy apache-httpclient-4.x


    【解决方案1】:

    如果这些应用程序具有不同的安全上下文,它们也可能具有不同的身份验证领域(或者至少它们是预期的)。可以在 AuthScope 对象上显式设置领域属性,以将其显式匹配到具有给定领域名称的特定身份验证上下文。

    【讨论】:

    • 不幸的是,在这种情况下,来自服务器的领域对于两个 uris 是相同的,我不控制交互的服务器端。
    • 我明白了。实际上在这种情况下使用多个客户端并没有错。不过,您可能想让它们共享一个连接池。这应该与使用一个 HttpClient 实例一样具有资源效率。
    • 我希望做一个更简洁的实现,但找不到其他选择,所以我同意了您关于多个客户端实例共享资源(如连接池)的建议。
    【解决方案2】:

    我认为你运气不好。查看文档,您无法创建向同一主机和端口上的不同路径发送不同密码的 Authscope。

    【讨论】:

    • 不一定。这就是身份验证领域的用途。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    相关资源
    最近更新 更多