web-dev-qa-db-fra.com

Comment désactiver csrf dans Spring en utilisant application.properties?

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();

    }
}
8
membersound

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

Mise à jour le 17 décembre 2017

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. 

7
EliuX

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");
    }
} 
2
Naor Bar