Home > Mobile >  Duplicate config code problem Spring Boot microservices
Duplicate config code problem Spring Boot microservices

Time:09-11

Is there a way to create a spring configuration class and use it to all my microservices?

For example, I have to copy the following configuration class and paste it through all my microservices which means that when I want to make a small change I have to go through all the microservices editing the same class.

I have investigated and the most I could find is to create a module with all the classes in common and import it in my microservices by the pom, what happens with this is that when I want to get the SecurityContextHolder.getContext() this is null for a context issue and I do not know very well how to give solution to this or what other alternatives there are.

@Configuration
public class FeignGlobalConfiguration {
    @Bean
    public ErrorDecoder errorDecoder() {
        return new RetrieveMessageErrorDecoder();
    }

    @Bean
    public RequestInterceptor requestInterceptor(){
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        return requestTemplate -> {
            requestTemplate.header(JwtClaims.USERNAME, authentication.getPrincipal().toString());
            requestTemplate.header(JwtClaims.CLIENT, authentication.getDetails().toString());
            requestTemplate.header(JwtClaims.TOKEN, authentication.getCredentials().toString());
            requestTemplate.header(JwtClaims.ROLES, authentication.getAuthorities().toString());
        };
    }
}

CodePudding user response:

The problem is your bean definition.

The line Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); is called when the bean is constructed so only once. After that the reference is used (which is probably null at the time of construction.

To solve move tha tline inside the lambda so it gets evaluated each time a request is processed.

@Bean
public RequestInterceptor requestInterceptor(){
    return requestTemplate -> {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        requestTemplate.header(JwtClaims.USERNAME, authentication.getPrincipal().toString());
        requestTemplate.header(JwtClaims.CLIENT, authentication.getDetails().toString());
        requestTemplate.header(JwtClaims.TOKEN, authentication.getCredentials().toString());
        requestTemplate.header(JwtClaims.ROLES, authentication.getAuthorities().toString());
    };
}
  • Related