it-swarm.com.de

So konfigurieren Sie Spring Security, um den Zugriff auf Swagger-URL ohne Authentifizierung zu ermöglichen

Mein Projekt hat Spring Security. Hauptproblem: Zugriff auf Swagger-URL unter http: // localhost: 8080/api/v2/api-docs nicht möglich. Es wird angezeigt, dass der Autorisierungsheader fehlt oder ungültig ist.

Screenshot des Browserfensters Mein pom.xml enthält folgende Einträge

<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/");
}

web.xml-Einträge:

<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

Das Hinzufügen zu Ihrer WebSecurityConfiguration-Klasse sollte den Trick erfüllen.

@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

Ich habe ein Update mit/configuration/** und/swagger-resources/** durchgeführt und es hat für mich funktioniert.

@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

Ich hatte das gleiche Problem mit Spring Boot 2.0.0.M7 + Spring Security + Springfox 2.8.0. Ich habe das Problem mit der folgenden Sicherheitskonfiguration gelöst, die den öffentlichen Zugriff auf die Ressourcen der Swagger-Benutzeroberfläche ermöglicht.

@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

wenn Ihre Springfox-Version höher als 2.5 ist, fügen Sie WebSecurityConfiguration wie folgt hinzu:

@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

Mehr oder weniger hat diese Seite Antworten, aber alle sind nicht an einem Ort. Ich habe mich mit dem gleichen Thema befasst und ziemlich viel Zeit damit verbracht. Jetzt habe ich ein besseres Verständnis und möchte es hier teilen:

Ich ermöglichte Swagger-Ui mit Spring-Web-Sicherheit:

Wenn Sie Spring Websecurity standardmäßig aktiviert haben, werden alle Anforderungen an Ihre Anwendung blockiert und 401 zurückgegeben. Für das Laden der Swagger-UI im Browser führt swagger-ui.html jedoch mehrere Aufrufe zum Sammeln von Daten aus. Die beste Möglichkeit zum Debuggen ist das Öffnen von swagger-ui.html in einem Browser (wie Google Chrome) und die Verwendung von Entwickleroptionen (Taste "F12"). Sie können mehrere Aufrufe sehen, die beim Laden der Seite ausgeführt wurden. Wenn das Swagger-Ui nicht vollständig geladen wird, schlagen wahrscheinlich einige davon fehl.

möglicherweise müssen Sie Spring websecurity mitteilen, dass die Authentifizierung für mehrere Swagger-Pfadmuster ignoriert wird. Ich benutze Swagger-Ui 2.9.2 und in meinem Fall sind die Muster, die ich ignorieren musste:

Wenn Sie jedoch eine andere Version verwenden, können sich die Versionen ändern. Sie müssen möglicherweise Ihre Entwickler-Option in Ihrem Browser herausfinden, wie ich bereits sagte.

@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 Swagger-UI mit Abfangjäger aktivieren

Im Allgemeinen möchten Sie möglicherweise keine Anforderungen abfangen, die von swagger-ui.html gestellt werden. Um mehrere Swagger-Muster unten auszuschließen, ist der Code:

Die meisten Fallmuster für Web-Sicherheit und Interceptor sind die gleichen. 

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

}

Da Sie @EnableWebMvc möglicherweise aktivieren müssen, um Interceptors hinzuzufügen, müssen Sie möglicherweise Ressourcenhandler hinzufügen, die ähnlich wie im obigen Codeausschnitt hinzugefügt werden.

0
chanderdevx

Wenn Sie alle Ihre API-Anforderungen mit einem URL-Muster von /api/.. betrachten, können Sie spring mit der folgenden Konfiguration angeben, nur dieses URL-Muster zu sichern. Was bedeutet, dass Sie dem Frühling sagen, was Sie sichern sollten, was Sie ignorieren sollten.

@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