In Internet & Development

Why this post?

You might ask why I do another post about this topic and not just entered the right search term in Google. The answer is simple – I did exactly this and found only solutions I didn’t like. I wanted some transparent way to add a basic-auth header and use my RestTemplate as I always did.

That’s what this post is all about.

Not much to say about – only the code!

I simply wrote an interceptor, called BasicAuthInterceptor, which adds the necessary headers for authentication.

import java.nio.charset.Charset;

import org.apache.commons.codec.binary.Base64;  
import org.slf4j.Logger;  
import org.slf4j.LoggerFactory;  
import org.springframework.http.HttpRequest;  
import org.springframework.http.client.ClientHttpRequestExecution;  
import org.springframework.http.client.ClientHttpRequestInterceptor;  
import org.springframework.http.client.ClientHttpResponse;

public class BasicAuthInterceptor implements ClientHttpRequestInterceptor {

    private static final Logger logger = LoggerFactory.getLogger( BasicAuthInterceptor.class );

    private final String username;
    private final String password;

    public BasicAuthInterceptor( String username, String password ) {
        this.username = username;
        this.password = password;

    public ClientHttpResponse intercept( HttpRequest request, byte[] body, ClientHttpRequestExecution execution ) throws IOException {

        //Build the auth-header
        final String auth = username + ":" + password;
        final byte[] encodedAuth = Base64.encodeBase64( auth.getBytes( Charset.forName( "US-ASCII" ) ) );
        final String authHeader = "Basic " + new String( encodedAuth );

        //Add the auth-header
        request.getHeaders().add( "Authorization", authHeader ); "Added Basic Authentication Header: user -> {}, password -> {}", username, mask( password ) );

        return execution.execute( request, body );

    private String mask( String toMask ) {
        return toMask.replaceAll( ".", "*" );

And here is how to use it in conjuction with your RestTemplate.

import java.util.ArrayList;  
import java.util.List;

import org.springframework.http.client.ClientHttpRequestInterceptor;  
import org.springframework.web.client.RestTemplate;

public class SimpleClient {

    public static void main( String[] args ) {

        //Get a new Rest-Template
        final RestTemplate template = new RestTemplate();

        //Create and initialize the interceptor
        final List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>();
        interceptors.add( new BasicAuthInterceptor( "admin", "secret" ) );
        template.setInterceptors( interceptors );

        //Do your request as normal...
        final String helloResponse = template.getForObject( "http://localhost:8080/hello", String.class ); 


The Maven dependencies

The following dependencies are required for the code to work. I used slf4j for logging – but you can use whatever you want to.


Recent Posts