Spring Security, Swagger URL'ye kimlik doğrulaması olmadan erişilmesine izin verecek şekilde nasıl yapılandırılır


92

Projemde Spring Security var. Ana sorun: http: // localhost: 8080 / api / v2 / api-docs adresinden havalı URL'ye erişilemiyor . Eksik veya geçersiz Yetkilendirme başlığı yazıyor.

Tarayıcı penceresinin ekran görüntüsü pom.xml dosyamda aşağıdaki girişler var

<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", "myeaddress@company.com", "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 girişleri:

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

Yanıtlar:


176

Bunu WebSecurityConfiguration sınıfınıza eklemek hile yapmalıdır.

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

}

11
Swagger-ui kullanıyorsanız şuna benzer bir şeye ihtiyacınız vardır: .antMatchers ("/ v2 / api-docs", "/ configuration / ui", "/ swagger-resources", "/ configuration / security", "/ swagger-ui .html "," / webjars / ** "," / swagger-resources / configuration / ui "," / swagger-ui.html "). permitAll ()
Daniel Martín

2
Benim durumumda bu kural çalışıyor: .antMatchers ("/ v2 / api-docs", "/ configuration / ui", "/ swagger-resources", "/ configuration / security", "/swagger-ui.html", "/ webjars / **", "/ swagger-resources / configuration / ui", "/ swagge‌ r-ui.html", "/ swagger-resources / configuration / security"). permitAll ()
nikolai.serdiuk

6
Daha fazla kural gerekli: .antMatchers ("/", "/ csrf", "/ v2 / api-docs", "/ swagger-kaynaklar / configuration / ui", "/ configuration / ui", "/ swagger-resources", "/ swagger-resources / configuration / security", "/ configuration / security", "/swagger-ui.html", "/ webjars / **"). permitAll ()
Mate Šimović

5
Cevap için teşekkürler! Web kavanozlarına / ** erişime izin veren herhangi bir güvenlik riski var mı?
ssimm

çok yardımcı cevap
Praveenkumar Beedanal

26

/ Configuration / ** ve / swagger-resources / ** ile güncelledim ve benim için çalıştı.

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

}

Mükemmel! Sorunu çözdüm.
Madhu

24

Spring Boot 2.0.0.M7 + Spring Security + Springfox 2.8.0 kullanırken aynı sorunu yaşadım. Ve Swagger UI kaynaklarına genel erişime izin veren aşağıdaki güvenlik yapılandırmasını kullanarak sorunu çözdüm.

@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
    }

}

2
Bu sınıfı ekledikten sonra, swagger-ui'yi görebiliyorum, ancak API'lere access_token ile bile postacı aracılığıyla erişilemiyor, aşağıdaki gibi erişim yasak hatası alıyorum,{ "timestamp": 1519798917075, "status": 403, "error": "Forbidden", "message": "Access Denied", "path": "/<some path>/shop" }
Chandrakant Audhutwar

@ChandrakantAudhutwar ifadeyi silin antMatchers("/**").authenticated()veya kendi kimlik doğrulama yapılandırmanızla değiştirin. Dikkatli olun, güvenlikle ne yaptığınızı bilseniz iyi olur.
naXa

evet, işe yaradı. Sadece swagger-ui'yi atlamayı düşünüyordum, ancak güvenli olduğu için diğer API'leri. şimdi API'lerim de atlandı.
Chandrakant Audhutwar

@ChandrakantAudhutwar tüm SecurityConfigurationsınıfı projenize kopyalayıp yapıştırmanıza gerek yok . SecurityConfigurationSwagger UI kaynaklarına yönelik isteklere izin verdiğiniz ve API'lerinizi güvende tuttuğunuz yerde kendinize sahip olmalısınız .
naXa

Ben var AuthorizationServerConfigurerAdapterAPI' kimlik yapar sınıfı uygulanmaktadır.
Chandrakant Audhutwar

12

Daha yeni bir havalı 3 sürümü kullananlar için org.springdoc:springdoc-openapi-ui

@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

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

1
Not: Bu, "Kimlik Doğrulaması Gerekli" hatası almanızı engelliyor, ancak yalnızca boş bir sayfa gösteriyorsa, bu listeye "/ swagger-resources / **" ve "/ swagger-resources" da eklemem gerekiyordu ve düzeltildi o benim için.
Vinícius M

5

Springfox sürümünüz 2.5 ,'dan yüksekse, aşağıdaki gibi WebSecurityConfiguration eklenmelidir:

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

duliu1990 haklı, springfox 2.5+ beri, tüm springfox kaynakları (swagger dahil) geride kaldı /swagger-resources. /v2/api-docsyapılandırma değişkeni ile geçersiz kılınabilir (UI ile hiçbir endişe) varsayılan dayı API son nokta olduğunu springfox.documentation.swagger.v2.path springfox
Mahieddine M. Ichir

3

Bu sayfada aşağı yukarı cevaplar var ama hepsi tek bir yerde değil. Ben de aynı konuyla uğraşıyordum ve oldukça iyi vakit geçirdim. Şimdi daha iyi bir anlayışa sahibim ve burada paylaşmak istiyorum:

Spring web güvenliği ile Swagger kullanıcı arayüzünü etkinleştiriyorum:

Spring Websecurity'i varsayılan olarak etkinleştirdiyseniz, uygulamanıza gelen tüm istekleri engeller ve 401'i döndürür. Ancak swagger kullanıcı arabiriminin tarayıcıya yüklenmesi için swagger-ui.html veri toplamak için birkaç çağrı yapar. Hata ayıklamanın en iyi yolu, bir tarayıcıda (google chrome gibi) swagger-ui.html'yi açmak ve geliştirici seçeneklerini kullanmaktır ('F12' tuşu). Sayfa yüklendiğinde yapılan birkaç çağrı görebilirsiniz ve swagger-ui tamamen yüklenmiyorsa muhtemelen bazıları başarısız oluyor.

Spring websecurity'e çeşitli havalı yol kalıpları için kimlik doğrulamasını yok saymasını söylemeniz gerekebilir. Swagger-ui 2.9.2 kullanıyorum ve benim durumumda göz ardı etmem gereken kalıplar aşağıdadır:

Ancak farklı bir sürüm kullanıyorsanız, sizinki değişebilir. Daha önce de söylediğim gibi tarayıcınızdaki geliştirici seçeneği ile sizinkini bulmanız gerekebilir.

@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 Interceptor ile swagger kullanıcı arayüzünü etkinleştirme

Genellikle swagger-ui.html tarafından yapılan istekleri engellemek istemeyebilirsiniz. Aşağıdaki birkaç swagger modelini hariç tutmak için kod:

Web güvenliği ve engelleyici vakalarının çoğu modeli aynı olacaktır.

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

}

@EnableWebMvc'yi durdurucu eklemek için etkinleştirmeniz gerekebileceğinden, yukarıdaki kod parçacığında yaptığıma benzer şekilde, kaynak işleyicileri de eklemeniz gerekebilir.


Neden /csrfdışlama ekliyorsunuz ?
Vishal

2

Yalnızca Swagger ile ilgili kaynaklarla sınırlama:

.antMatchers("/v2/api-docs", "/swagger-resources/**", "/swagger-ui.html", "/webjars/springfox-swagger-ui/**");

2

İşte Spring Security ile Swagger için eksiksiz bir çözüm . Muhtemelen Swagger'ı yalnızca geliştirme ve QA ortamımızda etkinleştirmek ve üretim ortamında devre dışı bırakmak istiyoruz. Bu nedenle, prop.swagger.enabledyalnızca geliştirme / qa ortamında swagger-ui için yay güvenliği kimlik doğrulamasını atlamak için bir özelliği ( ) işaret olarak kullanıyorum .

@Configuration
@EnableSwagger2
public class SwaggerConfiguration extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {

@Value("${prop.swagger.enabled:false}")
private boolean enableSwagger;

@Bean
public Docket SwaggerConfig() {
    return new Docket(DocumentationType.SWAGGER_2)
            .enable(enableSwagger)
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.your.controller"))
            .paths(PathSelectors.any())
            .build();
}

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

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

1

Spring Boot 5 kullanıyorum. Kimliği doğrulanmamış bir kullanıcının çağırmasını istediğim bu denetleyiciye sahibim.

  //Builds a form to send to devices   
@RequestMapping(value = "/{id}/ViewFormit", method = RequestMethod.GET)
@ResponseBody
String doFormIT(@PathVariable String id) {
    try
    {
        //Get a list of forms applicable to the current user
        FormService parent = new FormService();

İşte konfigürasyonda yaptığım şey.

  @Override
   protected void configure(HttpSecurity http) throws Exception {
    http
            .authorizeRequests()
            .antMatchers(
                    "/registration**",
                    "/{^[\\\\d]$}/ViewFormit",

Bu yardımcı olur umarım....


0

Sizin bir url kalıbına sahip tüm API isteklerinizi göz önünde bulundurarak, spring'e /api/..aşağıdaki yapılandırmayı kullanarak yalnızca bu url kalıbını güvenli hale getirmesini söyleyebilirsiniz. Bu, bahara neyi görmezden gelmek yerine neyi güvence altına alacağını söylediğiniz anlamına gelir.

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

1
Kısa vadeli sınırlı yardım sağlayabilecek bu kod parçacığı için teşekkür ederiz. Uygun bir açıklama , bunun neden soruna iyi bir çözüm olduğunu göstererek uzun vadeli değerini büyük ölçüde artıracak ve diğer benzer sorularla gelecekteki okuyucular için daha yararlı hale getirecektir. Yaptığınız varsayımlar da dahil olmak üzere bazı açıklamalar eklemek için lütfen yanıtınızı düzenleyin .
Toby Speight
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.