web-dev-qa-db-fra.com

401 au lieu de 403 avec Spring Boot 2

Avec Spring Boot 1.5.6.RELEASE j'ai pu envoyer le code d'état HTTP 401 au lieu de 403 comme décrit dans Comment laisser une réponse de sécurité non autorisée (code http 401) si vous demandez uri sans authentification , en faisant ceci:

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //...
        http.exceptionHandling()
                .authenticationEntryPoint(new Http401AuthenticationEntryPoint("myHeader"));
        //...
    }
}

en utilisant la classe org.springframework.boot.autoconfigure.security.Http401AuthenticationEntryPoint.

Je viens de mettre à niveau vers Spring Boot 2.0.0.RELEASE et je constate qu’il n’existe plus cette classe (du moins dans ce package).

Q: Cette classe (Http401AuthenticationEntryPoint) existe-t-elle encore dans Spring Boot? Si non, quelle pourrait être une bonne alternative pour conserver le même comportement dans un projet existant afin de préserver la cohérence avec d'autres implémentations qui dépendent de ce code d'état (401) au lieu de 403?

6
lealceldeiro

La classe org.springframework.boot.autoconfigure.security.Http401AuthenticationEntryPoint a été supprimée au profit de org.springframework.security.web.authentication.HttpStatusEntryPoint.

Dans mon cas, le code irait comme ceci:

public class SecurityConfig extends WebSecurityConfigurerAdapter {

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

Http401AuthenticationEntryPoint a été supprimé, voir 10715 :

Supprimer Http401AuthenticationEntryPoint

rwinch a commenté le 20 oct. 2017
Autant que je sache, il n'est pas utilisé dans la base de code Spring Boot. Il pourrait donc être utile de supprimer Http401AuthenticationEntryPoint.

Selon vos besoins, vous pouvez utiliser:

2
dur

vous pouvez personnaliser votre logique en remplaçant la classe AuthenticationEntryPoint Cela devrait fonctionner: 

@Component public class AuthEntryPointException implements AuthenticationEntryPoint, Serializable {

    private static final long serialVersionUID = -8970718410437077606L;

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response,
        AuthenticationException authException) throws IOException {
        response.setStatus(HttpStatus.SC_UNAUTHORIZED);
        response.setContentType("application/json");
        response.getWriter().write("{\"result\":\"UNAUTHORIZED\",\"message\":\"UNAUTHORIZED or Invalid Token\"}");
    }
}
0
user2530251

Juste pour élaborer la réponse de @ lealceldeiro:

Avant Spring Boot 2, ma classe de configuration Securiy ressemblait à ceci:

@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);
    }
//...
}

Et maintenant, dans Spring Boot 2, il ressemble à ceci:

@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));
    }
//...
}

Voir aussi ici: https://github.com/spring-projects/spring-boot/issues/10715#issuecomment-363592444

0
Tai Truong