Como proteger o Spring Boot com autenticação e autorização JWT

May 08 2023
Olá alunos, aqui vamos aprender sobre a implementação de segurança de primavera com spring boot3.0 e JWT.

Olá alunos, aqui vamos aprender sobre a implementação de segurança de primavera com spring boot3.0 e JWT. Isso é uma continuação da parte 1 do Spring Security: Link lá, discutimos sobre a implementação baseada na função de segurança do Spring, neste discutiremos como implementar o JWT.

JWT (JSON Web Tokens) é um padrão para representar reivindicações com segurança entre duas partes. É um meio compacto e seguro de URL de representar reivindicações a serem transferidas entre duas partes. Um JWT consiste em três partes: um cabeçalho, uma carga útil e uma assinatura.

Cabeçalho consiste em algoritmo e tipo de token, Carga consiste em assunto, nome, data de emissão, Verificar assinatura é a combinação de cabeçalho codificado, carga útil e chave secreta. O token JWT é uma combinação desses três

O Spring Security pode ser integrado ao JWT para proteger aplicativos da Web gerando, analisando e validando JWTs.

Fluxo para autenticar e autorizar com JWT

A seguir está uma visão geral de como a autenticação e autorização do JWT funcionam no Spring Boot :

  1. Autenticação do usuário: quando um usuário efetua login no sistema, o servidor verifica as credenciais do usuário, como nome de usuário e senha. Se as credenciais estiverem corretas, o servidor gera um JWT para o usuário e o retorna ao cliente.
  2. Criação de JWT: o servidor cria um JWT codificando as informações de identidade do usuário e outros dados necessários, como tempo de expiração, em um objeto JSON. O objeto JSON é então assinado usando uma chave secreta ou um par de chaves pública/privada.
  3. Armazenamento de token: o cliente armazena o JWT localmente, geralmente em um cookie ou armazenamento local.
  4. Autorização: para cada solicitação subsequente, o cliente envia o JWT no cabeçalho da solicitação. O servidor verifica a assinatura do JWT e decodifica seu conteúdo para extrair as informações de identidade do usuário e outros detalhes. Com base nessas informações, o servidor pode autorizar o usuário a acessar determinados recursos ou executar determinadas ações.
  5. Validação de token: o servidor também pode validar o JWT para garantir que ele não tenha sido adulterado e não tenha expirado. Se o token for inválido, o servidor pode rejeitar a solicitação ou solicitar que o usuário efetue login novamente.

Etapa 1: adicionar as dependências do JWT

Etapa 2: criar um endpoint para autenticar e gerar JWT

endpoint para autenticar e gerar token

No método CreateToken, estamos criando token definindo declarações, assunto, data de emissão e expiração, assinatura.

Etapa 3: criar um filtro para validar o JWT

crie uma classe para filtro e estenda com OncePerRequestFilter, substitua o método doFilterInternal e invoque o token de autorização do cabeçalho. Valide o token extraindo o nome de usuário e a data de expiração do token. Este arquivador é usado para validar o token JWT para cada chamada de API.

Etapa 4: adicionar a configuração para autorizar chamadas de API

Crie uma classe e adicione um método para autorizar, no código acima, dado acesso aos endpoints "/products/new","/products/authenticate" para todos os usuários, para endpoint "/products/**" apenas usuários autenticados com JWT válido podem acesso.

Testando a implementação

Autenticação e geração do token

/autenticar terminal

Copie o token gerado e adicione-o a outra chamada de API, estou acessando a API abaixo com credenciais de administrador

Se tentarmos acessar a API com credenciais de administrador, onde apenas o usuário pode acessar, obteremos o erro 403 Proibido

Observação: se você quiser o código github funcional desta implementação, siga-me e comente seu ID de e-mail. Vou enviar o link do código-fonte para o seu e-mail.

Parte 1: Acesso baseado em funções do Spring Security com Spring Boot

Consulte os links para outros conceitos do Spring Boot:

Tutorial de primavera AOP

Tutorial de log de inicialização do Spring

Configuração Centralizada no Spring Boot

Anotações do Hibernate mais usadas

Padrões importantes de design de microsserviços para entrevistas