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 Também na biblioteca
Envio de SMS em Kotlin: Biblioteca de API smslib4k
Cliente OAuth para C++: biblioteca liboauth para autorização
Rate Limiting em C# (.NET): guia da biblioteca System.Threading.RateLimiting