Ler o header da requisição

Tenho duas formas de fazer login.

login(credentials: any, tipo: string): Observable<void> {
    const logar =
      '?grant_type=password&username=' +
      credentials.login +
      '&password=' +
      encodeURIComponent(credentials.senha);
    const headers = {
      Authorization: 'Basic ' + btoa(SENHA + ':' + CLIENTE),
      tipo,
    };
    return this.http
      .post<any>(environment.AUTH + OAUTH + TOKEN + logar, {}, { headers })
      .pipe(map((response: any) => this.authenticateSuccess(response, true)));
  }

Estou pensando em passar o tipo pelo header da requisição, com o nome tipo. O que entendo que está chegando no servidor.

Mas a parte de login sempre vai para a classe TokenEndpoint do org.springframework.security.oauth2.provider.endpoint, no método:

@RequestMapping(value = "/oauth/token", method=RequestMethod.POST)
	public ResponseEntity<OAuth2AccessToken> postAccessToken(Principal principal, @RequestParam
	Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {

Ai entra no meu método de service para validação de usuário

MyUserDetailsService

Neste caso o sistema deverá fazer a seguinte forma:

se for do tipo tomador, deverá validar se o usuário cadastrado existe na tabela de usuário e tomador

se for do tipo admin, deverá validar se o usuário cadastrado existe na tabela de usuário

package br.com.ghnetsoft.apifinanceiro.usuariopermissao.service;

import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import br.com.ghnetsoft.apifinanceiro.model.tomadorresponsavel.TomadorResponsavel;
import br.com.ghnetsoft.apifinanceiro.model.usuario.Usuario;
import br.com.ghnetsoft.apifinanceiro.repository.tomadorresponsavel.TomadorResponsavelRepository;
import br.com.ghnetsoft.apifinanceiro.repository.usuario.UsuarioRepository;
import br.com.ghnetsoft.apifinanceiro.usuariopermissao.config.MyUserDetails;

@Service
public class MyUserDetailsService implements UserDetailsService {

	@Autowired
	private UsuarioRepository usuarioRepository;
	@Autowired
	private TomadorResponsavelRepository tomadorResponsavelRepository;

	@Override
	public UserDetails loadUserByUsername(String username) {
		Optional<Usuario> usuarioOptional = usuarioRepository.findByEmail(username);
		if (!usuarioOptional.isPresent()) {
			if (!usuarioOptional.isPresent()) {
				usuarioOptional = usuarioRepository.findByLogin(username);
				if (!usuarioOptional.isPresent()) {
					throw new UsernameNotFoundException("Usuário ou senha inválidos !");
				}
			}
		}
		Usuario usuario = Usuario.builder().build();
		if (usuarioOptional.isPresent()) {
			usuario = usuarioOptional.get();
			TomadorResponsavel tomadorResponsavel = tomadorResponsavelRepository.findByUsuario(usuario);
			if (tomadorResponsavel != null) {
				throw new UsernameNotFoundException("Usuário ou senha inválidos !");
			}
		}
		return new MyUserDetails(usuario);
	}
}

Não estou sabendo como pegar o valor do header

Alguma ideia sobre ?

Alguma ideia sobre ?

Talvez se você criar um interceptor você consiga acessar os headers da request!

Exemplo:

@Component
public class InterceptorHandler extends HandlerInterceptorAdapter {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // recupere os headers e execute o que deseja
		return true;
	}
	
}