Contamos con tu apoyo para difundir nuestras reseñas acerca de las ciencias de la computación.
Solución:
Con Spring Security 4.x ya hay una clase para eso.
org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint
La bota de primavera también incluye una
org.springframework.boot.autoconfigure.security.Http401AuthenticationEntryPoint
y ambos beneficios requieren que el desarrollador utilice especificaciones compatibles, ya que las respuestas 401 requieren que se establezca el encabezado WWW-Authenticate, el ejemplo de respuesta 401 podría ser:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example",
error="invalid_token",
error_description="The access token expired"
Entonces, en su configuración de seguridad, define y conecta automáticamente un bean de clase
Entonces, por ejemplo, con la aplicación Spring Boot:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
@Bean
public Http401AuthenticationEntryPoint securityException401EntryPoint()
return new Http401AuthenticationEntryPoint("Bearer realm="webrealm"");
...
@Override
protected void configure(HttpSecurity http) throws Exception
http
.authorizeRequests()
.antMatchers("/login").anonymous()
.antMatchers("/").anonymous()
.antMatchers("/api/**").authenticated()
.and()
.csrf()
.disable()
.headers()
.frameOptions().disable()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.logout()
.permitAll()
.exceptionHandling().authenticationEntryPoint(securityException401EntryPoint());
la línea relevante es:
.exceptionHandling().authenticationEntryPoint(securityException401EntryPoint());
A partir de Spring Boot 2, se eliminó la clase Http401AuthenticationEntryPoint (consulte Spring Boot Issue 10725).
En lugar de Http401AuthenticationEntryPoint, use HttpStatusEntryPoint con HttpStatus.UNAUTHORIZED:
http.exceptionHandling()
.authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED));
Tengo una solución aquí:
http
.authenticationEntryPoint(authenticationEntryPoint)
AuthenticationEntryPoint código fuente:
@Component
public class Http401UnauthorizedEntryPoint implements AuthenticationEntryPoint
private final Logger log = LoggerFactory.getLogger(Http401UnauthorizedEntryPoint.class);
/**
* Always returns a 401 error code to the client.
*/
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException arg2) throws IOException,
ServletException
log.debug("Pre-authenticated entry point called. Rejecting access");
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Access Denied");
Ten en cuenta compartir este enunciado si te fue útil.