spring - 使用当前 httpclient (4.x) 的 RestTemplate 基本或摘要身份验证

标签 spring restful-authentication http-authentication basic-authentication resttemplate

我正在尝试使用 RestTemplatehttpclient (4.x) 进行主要(或基本)身份验证。

由于我找不到任何有关如何实际执行此操作的示例,我尝试了各种方法来 Hook 各种 httpclient 工件,但没有运气 - 基本上,没有 Authentication header 发送到全部。

我目前的实现是:

DefaultHttpClient newHttpClient = new DefaultHttpClient();
Credentials credentials = new UsernamePasswordCredentials( username, password );
AuthScope authScope = new AuthScope( host, port, AuthScope.ANY_REALM );
BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials( authScope, credentials );
newHttpClient.setCredentialsProvider( credentialsProvider );

HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory( newHttpClient );
restTemplate.setRequestFactory( requestFactory );

我做错了什么吗?在任何地方都有一个可行的例子吗? 任何帮助表示赞赏。 谢谢。

最佳答案

尝试实现您自己的 RequestFactory 以实现抢先式身份验证。

public class PreEmptiveAuthHttpRequestFactory extends HttpComponentsClientHttpRequestFactory {

public PreEmptiveAuthHttpRequestFactory(DefaultHttpClient client) {
    super(client);
}

@Override
protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) {
    AuthCache authCache = new BasicAuthCache();
    BasicScheme basicAuth = new BasicScheme();
    HttpHost targetHost = new HttpHost(uri.getHost(), uri.getPort());
    authCache.put(targetHost, basicAuth);
    BasicHttpContext localcontext = new BasicHttpContext();
    localcontext.setAttribute(ClientContext.AUTH_CACHE, authCache);

    return localcontext;
}
}

然后就用它吧:

HttpComponentsClientHttpRequestFactory requestFactory = new PreEmptiveAuthHttpRequestFactory( newHttpClient );

希望对你有帮助


如何设置用户名和密码(抄自@bifur的评论)

您可以使用 UserNamePasswordCredentials

UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(getUsername(),getPassword()); 
client.getCredentialsProvider().setCredentials(new AuthScope(getHost(), getPort(), AuthScope.ANY_REALM), credentials); 

并且只使用之前工厂的客户端

HttpComponentsClientHttpRequestFactory requestFactory = new PreEmptiveAuthHttpRequestFactory(client);

关于spring - 使用当前 httpclient (4.x) 的 RestTemplate 基本或摘要身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9376549/

相关文章:

web-services - Restful Web 服务认证

java - 具有移动应用程序身份验证的 RESTful Web 服务

java - RESTful 身份验证 - 在高负载下导致性能不佳?

javascript - 跳过一条路由的 basicAuth

java - Spring 的 AspectJ NoSuchMethodError

java - BeanCreationException : Invocation of init method failed

php - 如何在不需要身份验证时从 URL 检索尝试的 $_SERVER ['REMOTE_USER' ]

ios7 - AFNetworking 2.0 和 HTTP 基本身份验证

java - 如何将netbeans中Java应用程序项目的 "/dist"文件夹中的.JAR文件导入到eclipse

java - Spring MVC Hibernate MySQL - 少1天进入数据库