1
resposta

Módulo 02- Provedor de autenticação | Aula 4

Nesta aula foi usado o SecurityConstextHolder para pegar o name no usuário logado, pergunto qual diferença entre usar esta classe e o objeto Principal passado como parâmetro da forma abaixo?

@PostMapping("novo")
    public String novoPedido(@Valid RequisicaoDTO requisicaoDTO, BindingResult result, Principal principal) {

        if (result.hasErrors()) {
            return "pedido/formulario";
        }

        User user = userRepository.findByUsername(principal.getName());

        Pedido pedido = requisicaoDTO.toPedido();
        pedido.setUser(user);

        repository.save(pedido);

        return "redirect:/home";
    }

Seria má pratica ou poderia gerar alguma falha de segurança ? O resultado é o mesmo na minha aplicação.

1 resposta

Olá Cleber! Tudo bem?

A diferença entre usar o SecurityContextHolder e o objeto Principal é que o primeiro é uma classe do Spring Security que permite acessar informações de segurança do contexto atual, como o nome do usuário logado, enquanto o segundo é uma interface do Java que representa o usuário autenticado.

Ambas as opções são seguras e não há problema em utilizá-las. A escolha entre uma ou outra pode depender do contexto da sua aplicação e da sua preferência pessoal.

No seu exemplo, o resultado é o mesmo porque o principal.getName() retorna o mesmo valor que você obteria usando o SecurityContextHolder.getContext().getAuthentication().getName(). Portanto, não há problema em usar o objeto Principal como parâmetro do método.

Espero ter ajudado e bons estudos!