CodeGym /Cursos /Módulo 5. Spring /Introducción a Spring Security

Introducción a Spring Security

Módulo 5. Spring
Nivel 17 , Lección 0
Disponible

Seamos sinceros: cualquier funcionalidad de una aplicación queda vulnerable sin protección. Para proteger la aplicación necesitamos Spring Security — un framework potente y flexible para incorporar seguridad en tus aplicaciones.

Esto es lo que hace:

  1. Autenticación: verificar que el usuario es realmente quien dice ser.
  2. Autorización: comprobar que el usuario tiene permiso para realizar ciertas acciones o acceder a datos.
  3. Protección de recursos: control de acceso a nivel de URLs, métodos e incluso datos.

Spring Security creció a partir del proyecto Acegi Security (así se llamaba antes) hasta convertirse en un framework de pleno derecho y pasó a formar parte del ecosistema Spring Framework. Sus herramientas para garantizar la seguridad se integran y personalizan con facilidad en casi cualquier proyecto.


Tareas principales de Spring Security

Vamos a repasar las tareas principales que resuelve este miembro de la familia Spring.

1. Autenticación

Imagina que entras en un sitio, escribes tu usuario y contraseña, y después el sistema te permite gestionar tus datos. Eso es la autenticación — el proceso de verificar tu identidad.

Spring Security soporta:

  • Formularios de login con usuario y contraseña
  • Basic Authentication (sí, sí, ese mismo login/contraseña del diálogo del navegador)
  • OAuth2 y OpenID Connect para login social
  • JWT (JSON Web Token) para APIs

2. Autorización

Ahora imagina que entraste al sistema como manager, pero intentas acceder a una sección cerrada disponible solo para administradores. No va a funcionar si tu cuenta no tiene suficientes permisos. Eso se llama autorización — determinar qué puedes hacer.

Spring Security proporciona:

  • Mecanismo de gestión de roles (RBAC — Role-Based Access Control)
  • Políticas de acceso no solo a páginas web, sino también a métodos y datos

3. Protección de recursos

Tus recursos pueden ser públicos (por ejemplo, la página de login pública) o protegidos (perfil privado, API). Spring Security permite separar fácilmente esos accesos.

Con él puedes:

  • Definir URLs públicas y protegidas
  • Restringir acceso a recursos según roles
  • Agregar SSL/TLS para proteger la transmisión de datos

¿Por qué usar Spring Security?

Y ahora lo más interesante: ¿por qué Spring Security? Como siempre, cuando se trata de Spring, la respuesta es sencilla: te hace la vida más fácil y te acelera el trabajo. Claro, podrías a la antigua comprobar manualmente en cada método que el usuario está autenticado y que su rol cumple los requisitos. Pero hacer eso es como arreglar un coche usando solo cinta aislante y un destornillador, cuando tienes una caja con herramientas especializadas perfectas para cada tarea. Solo abre la caja, aprende y úsalas.

Spring Security se parece a LEGO. ¿Quieres montar una protección básica? Usa bloques listos. ¿Necesitas un sistema de seguridad especial? Crea componentes únicos con los bloques disponibles.

Añadir un nuevo sistema de autorización o integrar JWT es tan sencillo como encajar nuevas piezas en el set. Y lo mejor: Spring Security encaja perfectamente en la familia Spring, como si llevaran toda la vida trabajando juntos.


¿Cómo funciona Spring Security?

Spring Security actúa como "un perro guardián con correa" que está en la puerta de tu aplicación. O como un conserje en un edificio. Intercepta las peticiones, comprueba si el usuario tiene acceso y o bien lo deja pasar o devuelve un error.


[Cliente] ---> [Spring Security Filter Chain] ---> [Controlador/Recurso]

Pasos principales:

  1. Filters (filtros): Spring Security usa una cadena de filtros (Filter Chain) para interceptar las peticiones y comprobar su seguridad. Por ejemplo, verificar si la petición contiene un token válido, o si el usuario introdujo la contraseña correcta.
  2. AuthenticationManager: es un interfaz en Spring Security que gestiona el proceso de autenticación. Es el componente que se llama desde los filtros cuando hay que verificar la autenticidad del usuario (por ejemplo, cotejar usuario y contraseña con la base de datos).
  3. AccessDecisionManager: interfaz de Spring Security. Toma decisiones sobre el acceso: si un usuario autenticado puede realizar una acción específica, teniendo en cuenta sus roles y permisos.

Ejemplo: configuración de seguridad básica

Vamos a probar en la práctica el poder de Spring Security. Para eso crearemos una aplicación web simple con autenticación básica.

1. Añadimos la dependencia en pom.xml:


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

Esta línea mágica añade al proyecto toda la funcionalidad necesaria de Spring Security.

2. Arrancamos la aplicación y probamos abrir cualquier URL

Si no has configurado nada, Spring Security ya está activado por defecto y protege todas las solicitudes. Al intentar abrir cualquier URL el navegador te pedirá usuario y contraseña. Pero, ¿de dónde saca Spring Security esos datos?

Spring Security crea automáticamente un usuario con nombre user y una contraseña generada, que puedes encontrar en los logs al iniciar la aplicación:


Using generated security password: [contraseña_aleatoria]

3. Configuramos nuestro propio usuario/contraseña

Ahora hagamos la aplicación un poco más amigable. Sobrescribimos la autenticación con nuestro usuario y contraseña a través de application.properties:


spring.security.user.name=admin
spring.security.user.password=admin123

4. Configuramos el acceso a distintas URLs

Creemos una configuración personalizada simple:


@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/public/**").permitAll()  // acceso para todos
                .antMatchers("/admin/**").hasRole("ADMIN")  // solo para admins
                .anyRequest().authenticated()  // todos los demás deben estar autenticados
            .and()
            .formLogin(); // usamos el formulario de login
    }
}

Qué ocurre aquí:

  • antMatchers("/public/**").permitAll() indica que el acceso a public está abierto para todos.
  • antMatchers("/admin/**").hasRole("ADMIN") restringe el acceso solo a usuarios con el rol ADMIN.
  • anyRequest().authenticated() exige autenticación para todas las demás peticiones.

Aplicación práctica

En la vida real, Spring Security es una herramienta imprescindible para cualquier aplicación web. ¿Quieres proteger tu REST API? Usa JWT. ¿Quieres un login seguro con autenticación de dos factores? Spring Security también te ayuda. La mayoría de las empresas esperan que un desarrollador entienda bien los fundamentos de seguridad, y Spring Security cubre prácticamente todos los escenarios.

Con este conocimiento podrás:

  1. Proteger tus aplicaciones contra accesos no autorizados.
  2. Integrarte con sistemas modernos de seguridad como OAuth2 y OpenID Connect.
  3. Hablar con suficiente confianza en entrevistas sobre seguridad de aplicaciones.

En la siguiente lección nos vamos a sumergir más a fondo en los conceptos de autenticación y autorización. Prepárate para no solo identificar "quién eres", sino también comprobar qué puedes hacer dentro de la aplicación.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION