Autorización y autenticación en Java: guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Autorización y autenticación en Java: conceptos básicos y herramientas



La autenticación y la autorización son dos pilares fundamentales de la seguridad de cualquier aplicación web. En el ecosistema de Java, existen numerosas bibliotecas y frameworks maduros para estas tareas. En este artículo, analizaremos en detalle las herramientas clave, sus características y proporcionaremos ejemplos prácticos de código.



1. Conceptos básicos

Antes de pasar a las herramientas, es importante diferenciar claramente los términos:

  • Autenticación — verificación de la identidad del usuario (¿quién es usted?). Generalmente se realiza mediante usuario/contraseña, tokens o biometría.
  • Autorización — verificación de los permisos de acceso (¿qué se le permite hacer?). Determina si un usuario puede realizar ciertas acciones.


2. Spring Security — el estándar de facto

Spring Security es el framework más popular para garantizar la seguridad en aplicaciones Java. Proporciona una solución integral tanto para autenticación como para autorización.



2.1. Configuración básica de autenticación

Para agregar Spring Security, añada la dependencia en pom.xml:

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-security</artifactId></dependency>


Configuración mínima con autenticación en memoria:

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.core.userdetails.User;import org.springframework.security.core.userdetails.UserDetails;import org.springframework.security.provisioning.InMemoryUserDetailsManager;import org.springframework.security.web.SecurityFilterChain;

@Configurationpublic class SecurityConfig {

@Bean public InMemoryUserDetailsManager userDetailsManager() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); return new InMemoryUserDetailsManager(user); }

@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(authz -> authz .requestMatchers("/admin/**").hasRole("ADMIN") .requestMatchers("/user/**").hasRole("USER") .anyRequest().authenticated() ) .formLogin(login -> login.defaultSuccessUrl("/home")) .httpBasic(); return http.build(); }}


3. JWT (JSON Web Tokens) para autenticación sin estado

JWT permite implementar autenticación sin almacenar estado en el servidor. El token contiene toda la información necesaria sobre el usuario y está firmado con una clave secreta.



3.1. Generación de JWT con la biblioteca jjwt

Añada la dependencia:

<dependency>    <groupId>io.jsonwebtoken</groupId>    <artifactId>jjwt-api</artifactId>    <version>0.12.5</version></dependency>


Ejemplo de creación y verificación de token:

import io.jsonwebtoken.Jwts;import io.jsonwebtoken.SignatureAlgorithm;import io.jsonwebtoken.security.Keys;import javax.crypto.SecretKey;import java.util.Date;

public class JwtUtil {

private static final SecretKey SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256); private static final long EXPIRATION_TIME = 3600000; // 1 hora

public static String generateToken(String username) { return Jwts.builder() .setSubject(username) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTi

Recommendations