Autorização e Autenticação em Java: guia completo com exemplos
No desenvolvimento web moderno, a segurança da aplicação é um dos aspectos-chave. No ecossistema Java, existem várias ferramentas consolidadas para implementar autenticação (verificação da identidade do usuário) e autorização (verificação de permissões de acesso). Neste artigo, abordaremos detalhadamente as bibliotecas e abordagens que ajudarão você a proteger sua aplicação.
Conceitos básicos
Antes de passarmos para as ferramentas, é importante diferenciar dois conceitos:
- Autenticação — processo de verificar se o usuário é quem diz ser (por exemplo, login e senha).
- Autorização — determinação de quais recursos ou ações estão disponíveis para o usuário autenticado.
Spring Security — padrão da indústria
Spring Security é um framework poderoso para garantir segurança em aplicações Java, especialmente em conjunto com Spring Boot. Ele fornece mecanismos prontos para autenticação via formulário, HTTP Basic, OAuth2, LDAP e muitos outros.
Principais funcionalidades:
- Configuração flexível de cadeias de filtros de segurança.
- Suporte a sessões e tokens JWT.
- Proteção contra ataques CSRF, XSS, Clickjacking.
- Integração com bancos de dados para armazenamento de usuários.
Exemplo de configuração básica do Spring Security usando JWT:
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.security.config.annotation.web.builders.HttpSecurity;import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;import org.springframework.security.config.http.SessionCreationPolicy;import org.springframework.security.web.SecurityFilterChain;
@Configuration@EnableWebSecuritypublic class SecurityConfig {
@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeHttpRequests(authz -> authz .requestMatchers("/api/auth/**").permitAll() .anyRequest().authenticated() ) .addFilterBefore(new JwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); return http.build(); }}JWT (JSON Web Token) — autorização contínua
JWT é uma forma compacta e autossuficiente de transmitir dados no formato JSON entre partes. Em Java, a biblioteca io.jsonwebtoken:jjwt é frequentemente usada para trabalhar com JWT.
Princípio de funcionamento:
- O usuário envia login/senha.
- O servidor verifica os dados e retorna um token JWT.
- O cliente armazena o token (por exemplo, no localStorage) e o envia no cabeçalho
Authorization: Bearer <token>. - O servidor verifica a assinatura do token e extrai os dados (papéis, identificador).
Exemplo de geração de JWT em Java:
import io.jsonwebtoken.Jwts;import io.jsonwebtoken.SignatureAlgorithm;import io.jsonwebtoken.security.Keys;import java.security.Key;import java.util.Date;
public class JwtUtil { private static final Key SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256);
public static String generateToken(String username, String role) { return Jwts.builder() .setSubject(username) .claim("role", role) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 1 hora .signWith(SECRET_KEY) .compact(); }}