Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

É realmente necessário recarregar o usuário em toda requisição autenticada?

No trecho abaixo, sempre que chega uma requisição com token o usuário é recarregado. Agora imagine milhares de requisições chegando e a todo momento os dados do usuário sendo recarregados. Não seria melhor guardar essas informações (com exceção da senha) no próprio token? Ou isso seria uma falha de segurança?

    private void autenticarCliente(String token) {
        Long idUsuario = tokenService.getIdUsuario(token);
        Usuario usuario = repository.findById(idUsuario).get();
        UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(usuario, null, usuario.getAuthorities());
        SecurityContextHolder.getContext().setAuthentication(authentication);
    }

PS. Era pra ter postado no fórum da segunda parte do curso, mas errei xD Se for possível alguém move para lá. Vlw.

3 respostas

O usuário tem que ser carregado todas as vezes pq pode acontecer de um token ser valido devido ao seu tempo de expiration ser alto mas o usuario não existir mais na base de dados. O usuario conseguiria acessar os recursos mesmo não tendo mais uma conta válida. Assim creio que teria um inconsistência e falha de segurança.

solução!

Minha recomendação é que você faça um cache dos usuários autenticados, ou seja, sempre que um usuário autenticar tu coloca ele no cache e quando deslogar tu remove ele do cache, daí não precisa mais ficar indo no banco toda hora ;-)

Oi Fausto,

Dentro do token é possível armazenar mais informações. Por exemplo:

...
.setSubject(logado.getId().toString())
.claim("nome", logado.getNome())
...

Com isso você pode armazenar as informações que precisará posteriormente, para não precisar buscar do banco de dados a cada request.

Bons estudos!