Introducción

1

Protección de aplicaciones con Spring Security

2

Configuración de Spring Security: Autorización y Autenticación

3

Configuración de Spring Security en Proyectos Java con Gradle

4

Autenticación Básica con Spring Security por Defecto

Configuración de seguridad

5

Configuración de Seguridad con Spring Security y Basic Authentication

6

Funcionamiento del Basic Authentication Filter en Spring Security

7

Deshabilitar protección CSRF en APIs REST con Spring Security

8

Configuración de CORS en Spring Security para APIs y Frontend

9

Configuración de Reglas de Acceso en Spring Security

10

Creación de usuarios personalizados en Spring Security

11

Creación y Gestión de Roles y Permisos en Aplicaciones Web

Autenticación con BD

12

Creación y Gestión de Usuarios en Base de Datos con Spring Security

13

Implementación de User Detail Service en Spring Security con MySQL

14

Asignación de Roles y Permisos en Spring Security

15

Permisos Específicos con Authorities en Spring Security

16

Seguridad de Métodos en Spring Security: Control de Accesos por Roles

Seguridad con JWT

17

Creación y Uso de JSON Web Tokens en Java con Auth0

18

Implementación de Autenticación con JSON Web Tokens en Spring Boot

19

Validación de JSON Web Tokens con Auth0 en Java

20

Creación de Filtro de Seguridad JWT en Spring Security

21

Implementación de JSON Web Token en Spring Security

Próximos pasos

22

Auditoría de Usuarios con Spring Security y Data JPA

23

Configuración y Personalización de Spring Security

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Configuración de Seguridad con Spring Security y Basic Authentication

5/23
Recursos

¿Cómo podemos configurar un Security Filter Chain en Spring?

Crear un Security Filter Chain en Spring nos permite manejar la seguridad de nuestras aplicaciones, definiendo cómo se autenticará y autorizará cada petición HTTP. Primero, debemos crear un paquete específico para la configuración de seguridad y una clase donde implementaremos los filtros necesarios.

¿Cómo creamos la configuración inicial de seguridad?

  1. Crear un paquete nuevo: Dentro de la capa web del proyecto, crea un paquete llamado Config.
  2. Anotar la clase con @Configuration: Esto permite que Spring gestione e inyecte automáticamente este bean dentro de la aplicación.
  3. Definir el método Security Filter Chain: Crea un método público que retorne un SecurityFilterChain y reciba un HttpSecurity como parámetro.
@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        return http.build();
    }
}

¿Cómo permitimos o restringimos peticiones HTTP?

Definir las reglas para autorizar peticiones es crucial para proteger una aplicación. Inicialmente, podemos permitir todas las peticiones, y posteriormente, aplicar seguridad ajustando estas configuraciones.

  • Permitir todas las peticiones: Esto esencialmente elimina las capas de autenticación.

    http
        .authorizeRequests()
        .anyRequest().permitAll();
    
  • Requerir autenticación básica para todas las peticiones: Prioriza la seguridad solicitando autenticación en cada acceso.

    http
        .authorizeRequests()
        .anyRequest().authenticated()
        .and().httpBasic();
    

¿Cómo validamos la configuración con Postman?

Con la configuración inicial realizada, verifica el comportamiento utilizando herramientas como Postman:

  1. Probar sin autorización: Elimina el encabezado de autorización y envía la petición. Si logras recibir una respuesta, significa que la seguridad está desactivada.
  2. Activar Basic Authentication: Configura la autenticación básica con el usuario y contraseña generados por Spring. Observa que las peticiones ahora requieren credenciales válidas.

En el código, aseguramos que las peticiones usen autenticación básica y verificamos el funcionamiento del filtro correspondiente:

http
    .authorizeRequests()
    .anyRequest().authenticated()
    .and().httpBasic();

Al lanzar la aplicación, el filtro BasicAuthenticationFilter gestionará las autenticaciones. Si el header de la autorización no está presente o es incorrecto, la petición será denegada.

¿Qué debemos tener en cuenta al implementar seguridad en Spring?

  • Gestión de usuarios y contraseñas: Usar User como el usuario por defecto puede ser seguro para desarrollo, pero en producción es crucial personalizar estas credenciales.
  • Desactivar filtros innecesarios: Spring incluye múltiples filtros por defecto. Solo mantén los relevantes para tu caso y desactiva el resto explícitamente.
  • Revisar la documentación de Spring Security: Spring es una herramienta poderosa, y conocer sus capacidades nos ayudará a adaptar más funcionalidades.

Este enfoque fortalece tu aplicación contra accesos no autorizados e intenta hacerlo accesible a usuarios válidos. Continúa explorando y ampliando tus habilidades en seguridad con Spring para dominar estos conceptos.

Aportes 15

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

La forma de configurar el objeto http que se muestra en la clase está deprecada, aquí una forma en que se puede configurar con los mismos parámetros, pero en la nueva forma:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
        .authorizeHttpRequests(customizeRequests -> {
            customizeRequests
                    .anyRequest()
                    .authenticated();
            }
        ).httpBasic(Customizer.withDefaults());
    
    return http.build();
}

Me sirvió de esta forma, la que el profe utiliza en el video esta deprecated

@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .anyRequest()
                .permitAll();

        return http.build();
    }
}
para el 2023 lo hice de esta manera guaindome de la documentación oficial de spring-security @Configuration public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{ http .authorizeHttpRequests((authorize) -> authorize .anyRequest().permitAll()); return http.build(); } }
En las versiones actuales se puede usar el siguiente ejemplo: @Configuration public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests((authorize) -> authorize .anyRequest().authenticated() ) .httpBasic(*withDefaults*()); return http.build(); } }
Comparto mi solución del error que sale en esta clase: 😎 \[Spring 3.3.4] 👇 ```java @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(authorize -> authorize .anyRequest() .authenticated()) .httpBasic(Customizer.withDefaults()); return http.build(); } } ```

Me funciono de esta forma, el metodo que ofrece el profesor dice que esta Deprecated

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .httpBasic(Customizer.withDefaults());

        return http.build();
    }
}

Con Customizer.withDefaults() te proporciona más flexibilidad si necesitas personalizar la configuración básica de autenticación.

Comparto mi solución del error que sale en esta clase: 😎 \[Spring 3.3.4] 👇 @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(authorize -> authorize .anyRequest() .authenticated()) .httpBasic(Customizer.*withDefaults*()); return http.build(); } }
<https://docs.spring.io/spring-security/reference/6.0-SNAPSHOT/servlet/authorization/authorize-http-requests.html>
Teniendo en cuenta la evolución de Spring, y dado que lo visto ya esta deprecado se puede generar esta solución para continuar con la ejecución en la máquina local `@Configuration public class SecurityConfig {` `@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests( (authorize) -> authorize .anyRequest() .authenticated()).httpBasic(``withDefaults``()); return http.build(); }` `}`
Comparto mi solución del error que sale en esta clase: 😎\[Spring 3.3.4] 👇 ```java @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(authorize -> authorize .anyRequest() .authenticated()) .httpBasic(Customizer.withDefaults()); return http.build(); } } ```
A esta fecha del 2024 construí la clase de la siguiente manera: ```js package com.platzi.pizzeria.web.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated()).httpBasic(Customizer.withDefaults()); return http.build(); } } ```
Si estás usando spring 3.2.2 y java 21 les comparto mir configuración ```java @Configuration @EnableWebSecurity public class SecurityConfig { @Value("${app.security.ignored}") private String\[] authWhiteList; @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http // Disable CSRF since it is a REST API .csrf(AbstractHttpConfigurer::disable) // Enable CORS configuration .cors(cors -> {}) // Configuring session management to be stateless .sessionManagement( sessionManagement -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) // Configuring route authorizations .authorizeHttpRequests( auth -> auth // Allow unauthenticated access to Swagger and other required endpoints .requestMatchers(authWhiteList).permitAll() .requestMatchers(PUBLIC\_API + "\*\*").permitAll() .anyRequest().authenticated()) // Add our JWT filter before the username and password authentication filter .addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); return http.build(); } @Bean public JwtAuthenticationFilter jwtAuthenticationFilter() { return new JwtAuthenticationFilter(); } } ```
```java @Configuration public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeRequests(authorize -> authorize .anyRequest().permitAll()) .httpBasic(withDefaults()); return http.build(); } } ```esta es lo forma que encontre para que funcione. RECUERDA, que al enviar la solicitud en Posman no te olvides de indicar en AUTHORIZATION TYPE No Auth
cordial saludo en el filterchain esta linea http.authorizeHttpRequests().anyRequest().permitAll(); aparece como deprecated? hay alguna alternativa en este caso para controlar este segmento ?