web-dev-qa-db-fra.com

Spring Boot 2.0.x désactive la sécurité de certains profils

Dans Spring Boot 1.5.x, la sécurité a été configurée et dans certains profils (par exemple, local), j'ai ajouté une ligne security.basic.enabled=false au fichier .properties pour désactiver toute la sécurité de ce profil. J'essaie de migrer vers le nouveau Spring Boot 2, où cette propriété de configuration est supprimée. Comment puis-je obtenir le même comportement (sans utiliser cette propriété) dans Spring Boot 2.0.x?

J'ai déjà lu Spring-Boot-Security-2.0 et security-changes-in-spring-boot-2-0-m4 et il n'y a rien qui concerne cette propriété.

8
leonz

Vous devez ajouter une configuration personnalisée de Spring Security, voir Guide de référence de Spring Spring :

28.1 Sécurité MVC

La configuration de sécurité par défaut est implémentée dans SecurityAutoConfiguration et UserDetailsServiceAutoConfiguration. SecurityAutoConfiguration imports SpringBootWebSecurityConfiguration pour la sécurité Web et UserDetailsServiceAutoConfiguration configure l'authentification, ce qui est également pertinent dans les applications non Web. Pour désactiver complètement la configuration de sécurité de l'application Web par défaut, vous pouvez ajouter un bean de type WebSecurityConfigurerAdapter (cela ne désactive pas la configuration UserDetailsService ni la sécurité de l'actionneur).

Par exemple:

@Configuration
public class ApplicationSecurity extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) throws Exception {
        web
           .ignoring()
               .antMatchers("/**");
    }
}

Pour utiliser la configuration uniquement pour un profil, ajoutez @Profile à la classe. Si vous souhaitez l'activer par propriété, ajoutez ConditionalOnProperty à la classe.

11
dur

Voici comment j'ai fini par résoudre le problème. Voici un exemple de ma configuration de sécurité dans Spring Boot 1.5.x. La sécurité a été désactivée avec la propriété security.basic.enabled=false:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/upload/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable().authorizeRequests()
                .anyRequest().authenticated()
                .and().httpBasic();
    }
}

Puisque security.basic.enabled a été supprimé dans Spring Boot 2 (mais toujours réservé comme nom de propriété), j'ai fini par utiliser security.enabled en tant que propriété personnalisée. Voici un exemple de ma configuration dans Spring Boot 2:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${security.enabled:true}")
    private boolean securityEnabled;

    @Override
    public void configure(WebSecurity web) throws Exception {
        if (securityEnabled)
            web.ignoring().antMatchers("/upload/**");
        else
            web.ignoring().antMatchers("/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        if (securityEnabled)
            http.csrf().disable().authorizeRequests()
                    .anyRequest().authenticated()
                    .and().httpBasic();
    }
}
4
leonz

Il existe une autre option pour désactiver la sécurité lors du démarrage du printemps 2

@EnableAutoConfiguration(exclude = {SecurityAutoConfiguration.class})

Ajouter ceci sur la classe principale

1

En réalité, il existe plusieurs réponses à certaines configurations pour cette question; Dans mon cas, j'ai joué à Spring Boot 2 avec Spring Security et JWT. Afin de sécuriser mes points de terminaison REST, je dois créer des jetons, etc. Après avoir écrit mon code et essayé de tester mes points de terminaison pour voir si JWT fonctionne correctement, la page de connexion par défaut me manque. J'ai essayé de changer le fichier de propriétés mentionné ci-dessus et je l'ai finalement désactivé en ajoutant l'annotation@SpringBootApplication(exclude = {SecurityAutoConfiguration.class} )à ma classe d'application.

@SpringBootApplication(exclude = {SecurityAutoConfiguration.class} )
public class JwtWithSpringBootApplication {

    public static void main(String[] args) {
        SpringApplication.run(JwtWithSpringBootApplication.class, args);
    }
}