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 eliminarHttp401AuthenticationEntryPoint
.
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.