使用RestTemplate进行基本身份验证
最后修改:2020年8月19日
表的内容
1.概述
本文展示了如何使用spring创建RestTemplate来使用由基本身份验证保护的RESTful服务。
一旦为模板设置了基本身份验证,将发送每个请求预先包含完整凭证执行身份验证过程所必需的。将对凭据进行编码,并使用授权HTTP报头,符合基本身份验证方案的规范。下面是一个例子:
授权:基本QWxhZGRpbjpvcGVuIHNlc2FtZQ = =
进一步阅读:
2.设置创建RestTemplate
引导的创建RestTemplate可以通过简单地为它声明一个bean来实现;但是,设置创建RestTemplate与基本身份验证将需要手动干预,因此与其直接声明bean,不如使用SpringFactoryBean将用于更多的灵活性。这个工厂将在初始化时创建和配置模板:
@Component public class RestTemplateFactory implements FactoryBean, InitializingBean {private RestTemplate RestTemplate;public RestTemplate getObject() {return RestTemplate;} public Class getObjectType() {return RestTemplate. Class;} public boolean isSingleton(){返回true;} public void afterPropertiesSet() {HttpHost host = new HttpHost("localhost", 8082, "http");restTemplate = new restTemplate (new HttpComponentsClientHttpRequestFactoryBasicAuth(host));}}
的宿主和港口值应该依赖于环境——允许客户端灵活地定义一组用于集成测试的值和另一组用于生产使用的值。控件可以管理这些值属性文件的第一类Spring支持。
3.手动管理授权HTTP头
创建的过程授权头文件对于Basic Authentication来说是相对简单的,所以它可以用几行代码手动完成:
HttpHeaders createHeaders(String username, String password){return new HttpHeaders() {{String auth = username + ":" + password;byte[] encodedAuth = Base64。encodeBase64 (auth.getBytes (Charset.forName (us - ascii)));String authHeader = "Basic " + new String(encodedAuth);set("Authorization", authHeader);}};}
然后,发送一个请求变得非常简单:
创建restTemplate。交易所(uri, HttpMethod。POST, new HttpEntity(createHeaders(用户名,密码)),clazz);
4.授权HTTP头的自动管理
Spring 3.0和3.1以及现在的4。x对Apache HTTP库有很好的支持:
- Spring 3.0,CommonsClientHttpRequestFactory与现在集成临终会HttpClient 3.倍
- Spring 3.1引入了对当前HttpClient 4.倍通过HttpComponentsClientHttpRequestFactory(JIRA中添加的支持spr - 6180)
- Spring 4.0通过HttpComponentsAsyncClientHttpRequestFactory
让我们开始设置HttpClient 4和Spring 4。
的创建RestTemplate将需要一个HTTP请求工厂——一个支持基本身份验证的工厂——到目前为止,一切顺利。然而,使用现有的HttpComponentsClientHttpRequestFactory直接将被证明是困难的,如同建筑一样创建RestTemplate设计没有良好的支持为HttpContext-拼图中的重要部分。所以我们需要子类化HttpComponentsClientHttpRequestFactory和覆盖createHttpContext方法:
public class HttpComponentsClientHttpRequestFactoryBasicAuth extends HttpComponentsClientHttpRequestFactory {HttpHost host;public HttpComponentsClientHttpRequestFactoryBasicAuth(HttpHost host) {super();这一点。宿主= host; } protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) { return createHttpContext(); } private HttpContext createHttpContext() { AuthCache authCache = new BasicAuthCache(); BasicScheme basicAuth = new BasicScheme(); authCache.put(host, basicAuth); BasicHttpContext localcontext = new BasicHttpContext(); localcontext.setAttribute(HttpClientContext.AUTH_CACHE, authCache); return localcontext; } }
它就在这里——在创造中HttpContext-基本的认证支持是内置的。正如你所看到的,在HttpClient 4中执行抢占式的基本身份验证。x是有点负担:身份验证信息被缓存,而设置这个身份验证缓存的过程是非常手动和不直观的。
这样一来,一切都就位了创建RestTemplate现在只需添加一个BasicAuthorizationInterceptor;
restTemplate.getInterceptors()。添加(新BasicAuthorizationInterceptor(“用户名”,“密码”));
和要求:
创建restTemplate。交易所(" http://localhost: 8082 / spring-security-rest-basic-auth / api / foo / 1”,HttpMethod。获取、零Foo.class);
关于如何保护REST服务本身的深入讨论,查看这篇文章。
5.Maven的依赖关系
控件需要以下Maven依赖项创建RestTemplate本身和HttpClient库:
<依赖> < groupId > org。springframework < / groupId > < artifactId > spring-webmvc < / artifactId > <版本> 5.0.6。RELEASE org.apache. conf . conf . conf . conf。httpcomponents httpclient 4.5.3 依赖>
可选,如果HTTP授权头文件是手动构造的,然后需要一个额外的库来支持编码:
commons-codec commons-codec 1.10
你可以在Maven存储库。
6.结论
虽然3。Apache HttpClient的x开发分支已经结束了一段时间,并且Spring对该版本的支持已经完全被弃用,可以找到关于创建RestTemplate安全问题仍然不能解释当前的HttpClient 4.x版本。本文试图通过详细、逐步地讨论如何使用创建RestTemplate以及如何使用它来使用安全的REST API。
除了本文中的代码样例之外,还包括消费端(本文在此进行了研究)和实际的RESTful服务的实现,我们来看看这个项目在Github。
这是一个基于maven的项目,因此它应该很容易导入和运行。