wake-up-neo.com

Wie kann man csrf im Frühling mit application.properties deaktivieren?

Die folgende Eigenschaft ist vorhanden:

security.enable-csrf=false

ABER der csrf-Schutz ist noch aktiv, wenn ich die Eigenschaft zu application.properties hinzufüge.

Was funktioniert, ist es programmatisch zu deaktivieren.

Aber ich würde Eigenschaften Konfiguration bevorzugen. Warum könnte es nicht funktionieren?

@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

Da WebSecurityConfigurerAdapter einen zwingenden Ansatz verwendet, können Sie den Wert der security.enable-csrf-Variablen einfügen und CSRF deaktivieren, wenn es falsch ist. Sie haben recht, ich denke, das sollte sofort funktionieren.

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

Ich habe diese Variable in meinem application.yml auf false gesetzt, wenn ich ein dev spring-Profil aktiv hatte, obwohl Sie auch für solche Zwecke ein Profil namens nosecurity erstellen könnten. Dies erleichtert diesen Prozess sehr:

--- application.yml ---

# Production configuration
server:
  port: ${server.web.port}
admin.email: ${admin.email}
#etc
---
spring:
  profiles: dev

security.enable-csrf: false

#other Development configurations

Ich hoffe es passt zu deinen Bedürfnissen

Update am 17. Dezember 2017

Basierend auf einem Kommentar eines Spring Boot-Mitglieds Dieses Problem wurde in neuen Spring-Versionen behoben: Ich hatte es auf Version 1.5.2.RELEASE, aber es scheint, dass in Version 1.5.9.RELEASE (die letzte stabile Version) Das Datum vor Version 2) ist bereits festgelegt und standardmäßig csrf deaktiviert und kann mit security.enable_csrf: true aktiviert werden. Eine mögliche Lösung könnte daher nur ein Upgrade auf Version 1.5.9.RELEASE sein, bevor Sie eine Hauptversion auf Version 2 erstellen, bei der die Architektur möglicherweise etwas anders ist. 

7
EliuX

Ein Update:

Anscheinend gibt es ein Problem mit der Deaktivierung von CSRF mithilfe von application.properties in Spring-Boot 1.x (und danke an Eliux für das Öffnen dieser case ).

Also, meine Lösung für spring-boot 1.5.7 mit einem eingebetteten Tomcat deaktiviert CSRF über die SecurityConfig -Klasse (beachte, dass ich auf diese Weise die Tomcat-Basisauthentifizierung beibehalten kann):

@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