web-dev-qa-db-fra.com

Comment configurer Spring Security pour permettre l'accès à l'URL de Swagger sans authentification

Mon projet a Spring Security. Problème principal: Impossible d'accéder à l'URL swagger à http: // localhost: 8080/api/v2/api-docs . Il dit En-tête d'autorisation manquant ou invalide.

Capture d'écran de la fenêtre du navigateur Mon pom.xml a les entrées suivantes

<dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.4.0</version>
    </dependency>

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.4.0</version>
    </dependency>

SwaggerConfig:

@Configuration
@EnableSwagger2
public class SwaggerConfig {

@Bean
public Docket api() {
    return new Docket(DocumentationType.SWAGGER_2).select()
            .apis(RequestHandlerSelectors.any())
            .paths(PathSelectors.any())
            .build()
            .apiInfo(apiInfo());
}

private ApiInfo apiInfo() {
    ApiInfo apiInfo = new ApiInfo("My REST API", "Some custom description of API.", "API TOS", "Terms of service", "[email protected]", "License of API", "API license URL");
    return apiInfo;
}

AppConfig:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.musigma.esp2" })
@Import(SwaggerConfig.class)
public class AppConfig extends WebMvcConfigurerAdapter {

// ========= Overrides ===========

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new LocaleChangeInterceptor());
}

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("swagger-ui.html")
      .addResourceLocations("classpath:/META-INF/resources/");

    registry.addResourceHandler("/webjars/**")
      .addResourceLocations("classpath:/META-INF/resources/webjars/");
}

entrées web.xml:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        com.musigma.esp2.configuration.AppConfig
        com.musigma.esp2.configuration.WebSecurityConfiguration
        com.musigma.esp2.configuration.PersistenceConfig
        com.musigma.esp2.configuration.ACLConfig
        com.musigma.esp2.configuration.SwaggerConfig
    </param-value>
</context-param>

WebSecurityConfig:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@ComponentScan(basePackages = { "com.musigma.esp2.service", "com.musigma.esp2.security" })
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
        .csrf()
            .disable()
        .exceptionHandling()
            .authenticationEntryPoint(this.unauthorizedHandler)
            .and()
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
        .authorizeRequests()
            .antMatchers("/auth/login", "/auth/logout").permitAll()
            .antMatchers("/api/**").authenticated()
            .anyRequest().authenticated();

        // custom JSON based authentication by POST of {"username":"<name>","password":"<password>"} which sets the token header upon authentication
        httpSecurity.addFilterBefore(loginFilter(), UsernamePasswordAuthenticationFilter.class);

        // custom Token based authentication based on the header previously given to the client
        httpSecurity.addFilterBefore(new StatelessTokenAuthenticationFilter(tokenAuthenticationService), UsernamePasswordAuthenticationFilter.class);
    }
}
39

Ajouter ceci à votre classe WebSecurityConfiguration devrait faire l'affaire.

@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/v2/api-docs",
                                   "/configuration/ui",
                                   "/swagger-resources",
                                   "/configuration/security",
                                   "/swagger-ui.html",
                                   "/webjars/**");
    }

}
84
Stijn Maller

J'ai mis à jour avec/configuration/** et/swagger-resources/** et cela a fonctionné pour moi.

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources/**", "/configuration/**", "/swagger-ui.html", "/webjars/**");

}
16
Akshata Suvarna

J'ai eu le même problème en utilisant Spring Boot 2.0.0.M7 + Spring Security + Springfox 2.8.0. Et j'ai résolu le problème en utilisant la configuration de sécurité suivante qui permet un accès public aux ressources de l'interface utilisateur Swagger.

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    private static final String[] AUTH_WHITELIST = {
            // -- swagger ui
            "/v2/api-docs",
            "/swagger-resources",
            "/swagger-resources/**",
            "/configuration/ui",
            "/configuration/security",
            "/swagger-ui.html",
            "/webjars/**"
            // other public endpoints of your API may be appended to this array
    };


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.
                // ... here goes your custom security configuration
                authorizeRequests().
                antMatchers(AUTH_WHITELIST).permitAll().  // whitelist Swagger UI resources
                // ... here goes your custom security configuration
                antMatchers("/**").authenticated();  // require authentication for any endpoint that's not whitelisted
    }

}
7
naXa

si votre version springfox supérieure à 2.5 devrait être ajouter WebSecurityConfiguration comme ci-dessous:

@Override
public void configure(HttpSecurity http) throws Exception {
    // TODO Auto-generated method stub
    http.authorizeRequests()
        .antMatchers("/v2/api-docs", "/swagger-resources/configuration/ui", "/swagger-resources", "/swagger-resources/configuration/security", "/swagger-ui.html", "/webjars/**").permitAll()
        .and()
        .authorizeRequests()
        .anyRequest()
        .authenticated()
        .and()
        .csrf().disable();
}
4
duliu1990

Plus ou moins cette page a des réponses mais toutes ne sont pas au même endroit. Je traitais du même problème et y passais un bon moment. Maintenant, j'ai une meilleure compréhension et je voudrais le partager ici:

I Activation de l'interface Web Swagger avec Spring Websecurity:

Si vous avez activé Spring Websecurity par défaut, toutes les requêtes de votre application seront bloquées et 401 sera renvoyé. Toutefois, pour que l'interface utilisateur swagger se charge dans le navigateur, swagger-ui.html effectue plusieurs appels pour collecter des données. Le meilleur moyen de déboguer consiste à ouvrir swagger-ui.html dans un navigateur (tel que Google Chrome) et à utiliser les options de développement (touche "F12"). Vous pouvez voir plusieurs appels passés lors du chargement de la page et si le swagger-ui ne se charge pas complètement, il est probable que certains d'entre eux échouent.

vous devrez peut-être dire à Spring Websecurity d'ignorer l'authentification pour plusieurs modèles de chemin d'accès swagger . J'utilise swagger-ui 2.9.2 et, dans mon cas, les modèles que je devais ignorer:

Cependant, si vous utilisez une version différente, celle-ci pourrait changer. vous devrez peut-être trouver la vôtre avec l'option développeur dans votre navigateur, comme je l'ai déjà dit.

@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", 
            "/swagger-resources/**", "/configuration/**", "/swagger-ui.html"
            , "/webjars/**", "/csrf", "/");
}
}

II Activation de l'interface utilisateur swagger avec intercepteur

En règle générale, vous ne souhaitez peut-être pas intercepter les demandes effectuées par swagger-ui.html. Pour exclure plusieurs modèles de swagger ci-dessous est le code:

La plupart des modèles de cas pour la sécurité Web et l'intercepteur seront les mêmes. 

@Configuration
@EnableWebMvc
public class RetrieveCiamInterceptorConfiguration implements WebMvcConfigurer {

@Autowired
RetrieveInterceptor validationInterceptor;

@Override
public void addInterceptors(InterceptorRegistry registry) {

    registry.addInterceptor(validationInterceptor).addPathPatterns("/**")
    .excludePathPatterns("/v2/api-docs", "/configuration/ui", 
            "/swagger-resources/**", "/configuration/**", "/swagger-ui.html"
            , "/webjars/**", "/csrf", "/");
}

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("swagger-ui.html")
      .addResourceLocations("classpath:/META-INF/resources/");

    registry.addResourceHandler("/webjars/**")
      .addResourceLocations("classpath:/META-INF/resources/webjars/");
}

}

Étant donné que vous devrez peut-être activer @EnableWebMvc pour ajouter des intercepteurs, vous devrez peut-être également ajouter des gestionnaires de ressources à swagger, comme dans l'extrait de code ci-dessus.

0
chanderdevx

En considérant toutes vos demandes d'API avec un modèle d'URL de /api/.., vous pouvez indiquer à Spring de ne sécuriser que ce modèle d'URL en utilisant la configuration ci-dessous. Ce qui signifie que vous dites à Spring ce qu'il faut sécuriser plutôt que ce qu'il faut ignorer.

@Override
protected void configure(HttpSecurity http) throws Exception {
  http
    .csrf().disable()
     .authorizeRequests()
      .antMatchers("/api/**").authenticated()
      .anyRequest().permitAll()
      .and()
    .httpBasic().and()
    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
0
Siddu