当前位置: 首页 > 知识库问答 >
问题:

使用RestTemplateBuilder的Spring BootRestTemplate基本身份验证

陈马鲁
2023-03-14

在SpringBoot中,我试图创建一个RestTemplate,它将使用

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    builder.basicAuthorization("username", "password");
    RestTemplate template = builder.build();
    return template;
}

然后,我在我的服务类中注入RestTem板作为

@Autowired
private RestTemplate restTemplate;

但是,我的请求失败了401未经授权的例外:

Caused by: org.springframework.web.client.HttpClientErrorException: 401 Unauthorized

使用另一个REST客户端(Postman),对同一URL的请求成功,因此我假设基本身份验证工作不正常。从调试输出来看,似乎未设置身份验证标头。是什么让这一切起作用的?

共有2个答案

闻人修平
2023-03-14

一种解决方案是按如下方式创建RestTem板:

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    RestTemplate template = builder.build();
    template.setMessageConverters(
        Arrays.asList(
            new FormHttpMessageConverter(),
            new StringHttpMessageConverter()
        )
    );
    template.getInterceptors().add(new BasicAuthorizationInterceptor("username", "password"));

    return template;
}
解翰采
2023-03-14

问题是您使用的restemplatebuilder方式错误。restemplatebuilder是不可变的。因此,在执行builder时。基本授权(“用户名”、“密码”)您实际上获得了一个新实例,添加并配置了restemplatebuilder基本授权拦截器。(这适用于restemplatebuilder的所有配置方法,它们都会创建一个新的复制实例)。

但是,您的代码正在丢弃特定配置的实例,并且基本上使用的是非安全默认的restemplatebuilder

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    builder.basicAuthorization("username", "password");
    RestTemplate template = builder.build();
    return template;
}

此代码应替换为类似的内容。

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder.basicAuthorization("username", "password").build();
}

它将使用特定配置的实例。

 类似资料:
  • 问题内容: 使用基本身份验证进行身份验证时遇到问题。我正在使用符合协议的标准枚举来构造我的请求。问题是,当我在枚举中手动设置授权标头时,如下所示: 我总是收到401未经授权的回复。 但是, 如果我像这样使用回调设置密码: 它正确认证。我希望能够在符合的枚举中手动进行设置,而不是在中传递凭据。 我知道它正在使用身份验证挑战的后台,但我希望能够手动设置它。 这是我的实现: 问题答案: 最终弄清楚了问题

  • 问题内容: 如何在Golang网站上实施基本身份验证?这样,当有人访问某个页面时,他们的 浏览器 会提示他们登录。 问题答案: 为了强制用户进行身份验证/在用户浏览器中显示基本身份验证提示,请发送标头 因此,如果您有通话,您可以 这将导致浏览器打开您所指的提示。

  • 我想使用基本身份验证调用keydrope Rest API。为了做到这一点,我尝试了下面的答案,但缺少链接。 我已将客户端访问类型设置为机密,并启用了直接访问授权。 显然,需要在Java适配器配置中指定启用基本身份验证,但我看不出这是如何实现的。文档中提到它是一个JSON文件,听起来像是我将其作为配置添加到Keyclope目录中。 最后,我看到有人提到使用生成的秘密。我可以在选项卡中生成一个秘密,

  • 问题内容: 我已经使用JAX-RS,Jersey和Grizzly编写了一个简单的REST服务器。这是我启动服务器的方式: 现在,我需要使用基本HTTP身份验证来保护资源,而且我不知道该怎么做。 如果可以更轻松地使它工作,我可以从Grizzly切换到Jetty,但是我确实很看重Grizzly提供的简单配置/启动。 我读了很多教程。他们都提到了web.xml,但是在我当前的配置中我没有一个。(我需要为

  • 问题内容: 我目前正在将第三方应用程序与我们的本地报告系统集成。我想使用基本身份验证来实现REST调用,但是在Spring 4.0.0中遇到了问题。我有一个简单的解决方案,效果很好: 但想通过以下方式将其重写为使用 ClientHttpRequestFactory : 此代码未编译,因为Spring 4.0.0中不再存在 CommonsClientHttpRequestFactory 类。有人知道

  • 我目前正致力于将第三方应用程序与我们的本地报告系统集成。我想用基本身份验证实现REST调用,但在Spring4.0.0中面临一些问题。我有一个简单的解决方案,效果很好: 但希望重写此代码,以便以以下方式使用ClientHttpRequestFactory: 由于Spring4.0.0中不再存在CommonsClientHttpRequestFactory类,因此没有编译此代码。有人知道其他的解决办