是否有任何方法使用apache httpclient来设置基于URI的凭据

时间:2012-08-09 20:18:59

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

目前我有一些使用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,我看不出有什么方法可以做到这一点。有没有人知道使用同一个客户端使用两套凭证的方法,还是我使用多个客户端?

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

2 个答案:

答案 0 :(得分:1)

我觉得你运气不好。查看文档,您无法创建一个Authscope,它将不同的密码发送到同一主机和端口上的不同路径。

答案 1 :(得分:1)

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