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