1
resposta

[Dúvida] A classe Authentication cria alguma instância da classe Usuário? Como recuperar mais informações da tabela usuarios a partir da Autenticação?

Na minha classe User (usuário), eu criei mais campos, sendo ao total:

**public class User implements UserDetails {
@Id
private Long id;
private String login;
private String password;
private String nome;
private String email;
**

Na minha classe controller, eu gostaria de ter acesso ao registro que foi autenticado mas a classe Authentication não tem os dados da classe User, conforme a seguir:

@RestController
@RequestMapping("nexus")
public class LoginController {
@Autowired
private AuthenticationManager am;

@GetMapping("/login")
public ResponseEntity getLogin(@RequestBody @Valid RequesLogin userLogin) {
    // senha: teste123456
    UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(userLogin.username(), userLogin.password());
    Authentication auth = am.authenticate(authToken);
    return ResponseEntity.ok("Vem vindo " + auth.getName());
}

}

Como poderia a partir da autenticação ter a instância completa da classe User?

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
1 resposta

Oi Alexandre, tudo bem? 😊

Entendi sua dúvida! 🤔

A classe Authentication do Spring Security, por padrão, não carrega automaticamente todos os campos da sua entidade User. Ela foca em autenticação e autorização, mantendo informações essenciais como nome de usuário e roles.

Para acessar os campos adicionais que você definiu na sua classe User, você precisa recuperar a instância completa do usuário a partir do objeto Authentication.

Uma forma de fazer isso é injetar seu serviço de usuário no LoginController e usá-lo para buscar o usuário pelo nome de usuário (login) após a autenticação.

Veja um exemplo:

@RestController
@RequestMapping("nexus")
public class LoginController {

    @Autowired
    private AuthenticationManager am;

    @Autowired
    private UserService userService; // Injete seu serviço de usuário

    @GetMapping("/login")
    public ResponseEntity getLogin(@RequestBody @Valid RequesLogin userLogin) {
        UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(userLogin.username(), userLogin.password());
        Authentication auth = am.authenticate(authToken);

        // Recupere o usuário completo do banco de dados
        User user = userService.findByLogin(auth.getName());

        // Agora você tem acesso a todos os campos do usuário
        return ResponseEntity.ok("Bem vindo " + user.getNome() + ", seu email é " + user.getEmail());
    }
}

Neste exemplo, userService.findByLogin(auth.getName()) busca o usuário no banco de dados usando o nome de usuário obtido da autenticação.

Lembre-se de que você precisa implementar o método findByLogin no seu serviço de usuário para buscar o usuário no banco de dados.

🎓 Para saber mais:

Espero que isso ajude! 💪