Почему базовая аутентификация всегда выдает ошибку 403 с restTemplate? - PullRequest
1 голос
/ 12 июня 2019

Я пробовал несколько способов вызвать URL-адрес get через RestTemplate в проекте весенней загрузки, чтобы получить json, но каждый раз я получал следующую ошибку 403:

  <200,{"request":{"mbean":"org.apache.activemq.artemis:address=%22my.queue.demo%22,broker=%22141.110.112.13%22,component=addresses,queue=%22my.queue.demo%22,routing-type=%22anycast%22,subcomponent=queues","attribute":"MessageCount","type":"read"},"error_type":"java.lang.Exception","error":"java.lang.Exception
 : Reading attribute MessageCount is forbidden for MBean
 org.apache.activemq.artemis:address=%22my.queue.demo%22,broker=%22141.110.112.13%22,component=addresses,queue=%22my.queue.demo%22,routing-type=%22anycast%22,subcomponent=queues","status":403},[Date:"Wed,
 12 Jun 2019 12:56:22 GMT", Cache-Control:"no-cache",
 Pragma:"no-cache", Access-Control-Allow-Origin:"*",
 X-Frame-Options:"SAMEORIGIN", X-XSS-Protection:"1",
 Content-Type:"text/plain;charset=utf-8", Expires:"Wed, 12 Jun 2019
 11:56:22 GMT", Transfer-Encoding:"chunked"]>

Это URL, который я пытаюсь вызвать:

http://10.185.148.153:1495/console/jolokia/read/org.apache.activemq.artemis:broker=%22141.110.112.13%22,component=addresses,address=%22my.queue.demo%22,subcomponent=queues,routing-type=%22anycast%22,queue=%22my.queue.demo%22/MessageCount

Когда я использую Postman с базовой аутентификацией (пользователь = тест, проход = тест), он работает, но не с Resttemplate.

Вот мой класс конфигурации:

@SpringBootApplication
public class StartWebApplication {

    public static void main(String[] args) {
        SpringApplication.run(StartWebApplication.class, args);
    }
}

@Configuration
class Appconfig{
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

Мой контролер:

...
@Autowired
private RestTemplate restTemplate;

....
restTemplate.exchange(url, HttpMethod.GET, createHeaders("test", "test"), String.class)
....
HttpEntity createHeaders(String username, String password) {
        byte[] token = Base64.getEncoder().encode(
                (username + ":" + password).getBytes());
        HttpHeaders headers = new HttpHeaders();
        headers.add("Authorization", "Basic " + new String(token));
        HttpEntity<String> request = new HttpEntity<>(headers);
        return request;
    }
}

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Используя RestTemplate, вы можете избежать некоторых шаблонов Base64 с помощью:

@Bean
RestTemplate rest() {
    RestTemplate rest = new RestTemplate();
    rest.getInterceptors().add(new BasicAuthenticationInterceptor("test", "test"));
    return rest;
}

Тогда вы можете просто сделать:

rest.getForObject(url, String.class);

Не уверен, что проблема в том,что-то в вашем Base64-введении имени пользователя и пароля, но это исключит эту возможность.

0 голосов
/ 12 июня 2019

Можете ли вы попробовать:

String auth = username + ":" + password;
byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(Charset.forName("US-ASCII")));
headers.add("Authorization", "Basic " + new String(encodedAuth));
...