La propriété suivante existe:
security.enable-csrf=false
MAIS la protection csrf est toujours active si j'ajoute la propriété à application.properties
.
Ce qui fonctionne est de le désactiver par programme.
Mais je préférerais la configuration des propriétés. Pourquoi ne pourrait-il pas fonctionner?
@Configuration
public class AuthConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.csrf().disable();
}
}
Comme WebSecurityConfigurerAdapter
utilise une approche impérative, vous pouvez injecter la valeur de la variable security.enable-csrf
et désactiver CSRF quand elle est fausse. Vous avez raison, je pense que cela devrait fonctionner hors de la boîte.
@Configuration
public class AuthConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Value("${security.enable-csrf}")
private boolean csrfEnabled;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
if(!csrfEnabled)
{
http.csrf().disable();
}
}
}
Ce que j'ai fait est de définir cette variable sur false dans mon application.yml lorsque, lorsque mon profil dev spring est actif, vous pouvez également créer un profil appelé nosecurity. Cela facilite beaucoup ce processus:
--- application.yml ---
# Production configuration
server:
port: ${server.web.port}
admin.email: ${admin.email}
#etc
---
spring:
profiles: dev
security.enable-csrf: false
#other Development configurations
J'espère que cela répond à vos besoins
D'après un commentaire d'un membre de Spring Boot ce problème est résolu sur les nouvelles versions de Spring: je l'avais sur la version 1.5.2.RELEASE
mais il semble que dans la version 1.5.9.RELEASE (la dernière version stable à la date avant la version 2) est déjà fixée et par défaut, csrf est désactivé et peut être activé avec security.enable_csrf: true
. Par conséquent, une solution possible pourrait simplement consister à mettre à niveau vers la version 1.5.9.RELEASE
, avant d’en faire une version majeure vers la version 2 où l’architecture pourrait être bien plus différente.
Une mise à jour:
On dirait qu'il y a un problème avec la désactivation de CSRF à l'aide de application.properties sur spring-boot 1.x (et merci à Eliux d'avoir ouvert ce cas ).
Donc, ma solution pour spring-boot 1.5.7 avec un Tomcat intégré consiste à désactiver CSRF via la classe SecurityConfig (notez que de cette manière, je conserve l'authentification de base Tomcat ootb):
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// Note:
// Use this to enable the Tomcat basic authentication (Tomcat popup rather than spring login page)
// Note that the CSRf token is disabled for all requests (change it as you wish...)
http.csrf().disable().authorizeRequests().anyRequest().authenticated().and().httpBasic();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
// Add here any custom code you need in order to get the credentials from the user...
auth.inMemoryAuthentication()
.withUser("myUserName")
.password("myPassword")
.roles("USER");
}
}