Autorização e Autenticação em Java: Spring Security e JWT

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Autorização e Autenticação em Java: Spring Security e JWT



Organizar o acesso seguro aos recursos é uma das principais tarefas ao desenvolver aplicações web em Java. Neste artigo, abordaremos dois conceitos fundamentais: autenticação (verificação da identidade do usuário) e autorização (verificação das permissões de acesso). Veremos exemplos práticos usando o popular framework Spring Security e a tecnologia JSON Web Tokens (JWT).



1. Conceitos Básicos



Antes de passarmos ao código, é importante diferenciar claramente os termos:



  • Autenticação (Authentication) — processo de verificar quem é o usuário. Geralmente é feita por meio de login e senha, biometria ou tokens.
  • Autorização (Authorization) — processo de determinar o que o usuário tem permissão para fazer. Por exemplo, acesso a determinados endpoints da API ou funções da aplicação.


Em aplicações Java modernas, para implementar esses mecanismos, a combinação mais comum é Spring Security + JWT. O JWT permite armazenar informações do usuário em um token compacto, que pode ser facilmente transmitido entre cliente e servidor.



2. Configuração do Spring Security com JWT



Adicionaremos as dependências necessárias no pom.xml (Maven):



<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-security</artifactId></dependency><dependency>    <groupId>io.jsonwebtoken</groupId>    <artifactId>jjwt-api</artifactId>    <version>0.12.3</version></dependency><dependency>    <groupId>io.jsonwebtoken</groupId>    <artifactId>jjwt-impl</artifactId>    <version>0.12.3</version>    <scope>runtime</scope></dependency><dependency>    <groupId>io.jsonwebtoken</groupId>    <artifactId>jjwt-jackson</artifactId>    <version>0.12.3</version>    <scope>runtime</scope></dependency>


3. Criação do serviço para trabalhar com JWT



Criaremos a classe JwtService, que será responsável pela geração e verificação de tokens:



import io.jsonwebtoken.Claims;import io.jsonwebtoken.Jwts;import io.jsonwebtoken.SignatureAlgorithm;import io.jsonwebtoken.security.Keys;import org.springframework.stereotype.Service;

import javax.crypto.SecretKey;import java.util.Date;import java.util.HashMap;import java.util.Map;

@Servicepublic class JwtService {

private final SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256); private final long expirationMs = 86400000; // 24 horas

public String generateToken(String username) { Map<String, Object> claims = new HashMap<>(); return Jwts.builder() .setClaims(claims) .setSubject(username) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + expirationMs)) .signWith(secretKey) .compact(); }

public String extractUsername(String token) { return extractAllClaims(token).getSubject(); }

private Claims extractAllClaims(String token) { return Jwts.parserBuilder() .setSigningKey(secretKey) .build() .parseClaimsJws(token) .getBody(); }

public boolean isTokenValid(String token, String username) { final String extractedUsername = extractUsername(token); return (extractedUsername.equals(username) && !isTokenExpired(token)); }

private boolean isTokenExpired(String token) { return extractAllClaims(token).getExpiration().befo

Recommendations