Saltar al contenido

Spring Security 401 anónimo en lugar de 403

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.

¡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 *