Saltar al contenido

401 en lugar de 403 con Spring Boot 2

La guía paso a paso o código que verás en este artículo es la resolución más fácil y efectiva que encontramos a esta inquietud o problema.

Solución:

Aviso

Por defecto Spring Boot 2 volverá 401 cuando spring-boot-starter-security se agrega como una dependencia y se realiza una solicitud no autorizada.

Esto puede cambiar si coloca algunas configuraciones personalizadas para modificar el comportamiento del mecanismo de seguridad. Si ese es el caso y realmente necesita forzar el 401 estado, luego lea la publicación original a continuación.

Publicación original

La clase org.springframework.boot.autoconfigure.security.Http401AuthenticationEntryPoint fue eliminado a favor de org.springframework.security.web.authentication.HttpStatusEntryPoint.

En mi caso el código sería así:

public class SecurityConfig extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        //...
        http.exceptionHandling()
            .authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED));
        //...
    

Prima

Si necesita devolver alguna información en el cuerpo de respuesta o personaliza la respuesta de alguna manera, puedes hacer algo como esto:

1- Extender AuthenticationEntryPoint

public class MyEntryPoint implements AuthenticationEntryPoint 
    private final HttpStatus httpStatus;
    private final Object responseBody;

    public MyEntryPoint(HttpStatus httpStatus, Object responseBody) 
        Assert.notNull(httpStatus, "httpStatus cannot be null");
        Assert.notNull(responseBody, "responseBody cannot be null");
        this.httpStatus = httpStatus;
        this.responseBody = responseBody;
    

    @Override
    public final void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException 
        response.setStatus(httpStatus.value());

        try (PrintWriter writer = response.getWriter()) 
            writer.print(new ObjectMapper().writeValueAsString(responseBody));
        
    

2- Proporcionar una instancia de MyEntryPoint a la configuración de seguridad

public class SecurityConfig extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        // customize your response body as needed
        Map responseBody = new HashMap<>();
        responseBody.put("error", "unauthorized");

        //...
        http.exceptionHandling()
            .authenticationEntryPoint(new MyEntryPoint(HttpStatus.UNAUTHORIZED, responseBody));
        //...
    

Http401AuthenticationEntryPoint fue removido.

Ver Spring Boot Github Repo > Problema #10715 (Eliminar Http401AuthenticationEntryPoint):

Eliminar Http401AuthenticationEntryPoint

rwinch comentó el 20 de octubre de 2017
Por lo que puedo decir, no se está utilizando en la base de código de Spring Boot, por lo que podría ser bueno eliminar Http401AuthenticationEntryPoint.

Dependiendo de sus requisitos, puede utilizar:

  • HttpStatusEntryPoint
  • BasicAuthenticationEntryPoint

Solo para elaborar la respuesta de @lealceldeiro:

Antes de Spring Boot 2, mi clase de configuración de seguridad se veía así:

@Configuration
public class MyConfig extends WebSecurityConfigurerAdapter 

    @Bean
    public Http401AuthenticationEntryPoint securityException401EntryPoint() 
      return new Http401AuthenticationEntryPoint("Bearer realm="webrealm"");
    

    @Autowired
    private Http401AuthenticationEntryPoint authEntrypoint;

    @Override
    protected void configure(HttpSecurity http) throws Exception 

      // some http configuration ...

      // Spring Boot 1.5.x style
      http.exceptionHandling().authenticationEntryPoint(authEntrypoint);
    
//...

Y ahora en Spring Boot 2 se ve así:

@Configuration
public class MyConfig extends WebSecurityConfigurerAdapter 

    //Bean configuration for Http401AuthenticationEntryPoint can be removed

    //Autowiring also removed

    @Override
    protected void configure(HttpSecurity http) throws Exception 

      // some http configuration ...

      // Spring Boot 2 style
      http.exceptionHandling().authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED));
    
//...

Véase también este comentario en Spring Boot Github Repo > PR Eliminar Http401AuthenticationEntryPoint.

Comentarios y puntuaciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *