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
?
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));
//...
}
}
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 supprimerHttp401AuthenticationEntryPoint
.
Selon vos besoins, vous pouvez utiliser:
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\"}");
}
}
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