Autorização e Autenticação em Kotlin: JWT, Spring Security e Ktor

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 Kotlin: guia completo

No desenvolvimento web moderno em Kotlin, a segurança da aplicação começa com a implementação correta da autenticação (verificação da identidade do usuário) e autorização (verificação de permissões de acesso). Neste artigo, abordaremos as principais abordagens, bibliotecas e ferramentas para implementar esses mecanismos nas plataformas Spring Boot e Ktor.



Conceitos básicos

Antes de passarmos ao código, vamos esclarecer os termos:

  • Autenticação — processo de verificar se o usuário é quem diz ser (geralmente por meio de login/senha, token ou biometria).
  • Autorização — determinação dos direitos de acesso de um usuário autenticado (por exemplo, acesso a rotas ou dados específicos).
  • JWT (JSON Web Token) — token compacto e autossuficiente para transmissão de dados entre as partes.
  • BCrypt — algoritmo de hash de senhas com salt, resistente a ataques de força bruta.


Autenticação com JWT no Spring Boot

O Spring Security fornece uma infraestrutura poderosa para autenticação. Vamos implementar a autenticação JWT usando a biblioteca io.jsonwebtoken:jjwt.



// build.gradle.ktsdependencies {    implementation("org.springframework.boot:spring-boot-starter-security")    implementation("io.jsonwebtoken:jjwt-api:0.12.3")    runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.3")    runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.3")}


Criaremos uma classe utilitária para trabalhar com JWT:



import io.jsonwebtoken.*import io.jsonwebtoken.security.Keysimport org.springframework.stereotype.Componentimport java.security.Keyimport java.util.*

@Componentclass JwtUtil { private val secretKey: Key = Keys.secretKeyFor(SignatureAlgorithm.HS256) private val expirationMs: Long = 3600000 // 1 hora

fun generateToken(username: String): String { return Jwts.builder() .subject(username) .issuedAt(Date()) .expiration(Date(System.currentTimeMillis() + expirationMs)) .signWith(secretKey) .compact() }

fun extractUsername(token: String): String? { return try { Jwts.parser().verifyWith(secretKey).build() .parseSignedClaims(token).payload.subject } catch (e: Exception) { null } }

fun validateToken(token: String): Boolean { return try { Jwts.parser().verifyWith(secretKey).build() .parseSignedClaims(token) true } catch (e: JwtException) { false } }}


Filtro de autenticação para Spring Security

Agora, criaremos um filtro que interceptará as requisições e verificará o token JWT:



import jakarta.servlet.FilterChainimport jakarta.servlet.http.HttpServletRequestimport jakarta.servlet.http.HttpServletResponseimport org.springframework.security.authentication.UsernamePasswordAuthenticationTokenimport org.springframework.security.core.context.SecurityContextHolderimport org.springframework.security.web.authentication.WebAuthenticationDetailsSourceimport org.springframework.stereotype.Componentimport org.springframework.web.filter.OncePerRequestFilter

@Componentclass JwtAuthFilter( private val jwtUtil: JwtUtil, private val userDetailsService: org.springframework.security.core.userdetails.UserDetailsService) : OncePerRequestFilter() {

override fun doFilterInternal( request: HttpServletRequest, response: HttpServletResponse, chain: FilterChain ) { val authHeader = request.getHeader("Authorization") if (authHeader == null || !authHeader.startsWith("Bearer ")) { chain.doFilter(request, re

Recommendations