स्वैगर URL को प्रमाणीकरण के बिना एक्सेस करने की अनुमति देने के लिए स्प्रिंग सिक्योरिटी को कैसे कॉन्फ़िगर करें


97

मेरे प्रोजेक्ट में स्प्रिंग सिक्योरिटी है। मुख्य मुद्दा: http: // localhost: 8080 / api / v2 / api-docs पर स्वैगर URL तक पहुँचने में सक्षम नहीं है । यह कहता है कि गुम या अमान्य प्राधिकरण शीर्षक।

ब्राउज़र विंडो का स्क्रीनशॉट My pom.xml में निम्न प्रविष्टियाँ हैं

<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 प्रविष्टियाँ:

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

जवाबों:


180

इसे अपने WebSecurityConfiguration क्लास में जोड़कर ट्रिक करनी चाहिए।

@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
यदि आप स्वैगर-उई का उपयोग करते हैं, तो आपको कुछ इस तरह की आवश्यकता होगी: .antMatchers ("/ v2 / api-docs", "/ कॉन्फ़िगरेशन / ui", "/ स्वैगर-संसाधन", "/ कॉन्फ़िगरेशन / सुरक्षा", "/ स्वैगर-उई" .html "," / वेबजार्स / ** "," / स्वैगर-रिसोर्सेस / कॉन्फ़िगरेशन / यूआई "," / स्वैगर-ui.html ")। permAll ()
डैनियल

2
मेरे मामले में यह नियम काम कर रहा है: .antMatchers ("/ v2 / api-docs", "/ configuration / ui", "/ swagger-resource", "/ कॉन्फ़िगरेशन / सुरक्षा", "/swagger -ui.html"), "" (वेबजार्स / ** "," / स्वैगर-रिसोर्सेस / कॉन्फ़िगरेशन / यूआई "," / स्वैग-आर-यूयूआईएचईजी "," / स्वैगर-संसाधन / कॉन्फ़िगरेशन / सुरक्षा ")। permAll ()
nikolai.serdiuk

6
अधिक नियमों की आवश्यकता है: .antMatchers ("/", "/ csrf", "/ v2 / एपीआई-डॉक्स", "/ स्वैगर-संसाधन / कॉन्फ़िगरेशन / ui", "/ कॉन्फ़िगरेशन / ui", "/ स्वैगर-संसाधन") "" स्वैगर-संसाधन / कॉन्फ़िगरेशन / सुरक्षा "," / कॉन्फ़िगरेशन / सुरक्षा "," /swagger-ui.html "," / webjars / ** ")। PermAll ()
मेट ovimović

5
जवाब के लिए धन्यवाद! क्या कोई सुरक्षा जोखिम वेबजारों / ** तक पहुंच की अनुमति देता है?
ssimm

बहुत उपयोगी उत्तर
प्रवीणकुमार बीडानल

26

मैंने / कॉन्फ़िगरेशन / ** और / स्वैगर-संसाधनों / ** के साथ अद्यतन किया और यह मेरे लिए काम किया।

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

}

उत्तम! मुद्दे को हल किया।
मधु

25

मुझे स्प्रिंग बूट 2.0.0.M7 + स्प्रिंग सुरक्षा + स्प्रिंगफ़ॉक्स 2.8.0 का उपयोग करने में एक ही समस्या थी। और मैंने निम्नलिखित सुरक्षा कॉन्फ़िगरेशन का उपयोग करके समस्या को हल किया जो कि स्वैगर UI संसाधनों तक सार्वजनिक पहुंच की अनुमति देता है।

@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
इस वर्ग को जोड़ने के बाद, मैं स्वैगर-उई को देख पा रहा हूं, लेकिन एपीआई को पोस्टमैन के माध्यम से भी एक्सेस नहीं किया जा सकता है यहां तक ​​कि एक्सेस_टोकन के साथ भी नीचे की तरह निषिद्ध त्रुटि प्राप्त हो सकती है,{ "timestamp": 1519798917075, "status": 403, "error": "Forbidden", "message": "Access Denied", "path": "/<some path>/shop" }
चंद्रकांत औधुतवार

@ChandrakantAudhutwar antMatchers("/**").authenticated()स्टेटमेंट को डिलीट कर देता है या आपके खुद के ऑथेंटिकेशन कॉन्फ़िगरेशन से बदल जाता है। सावधान रहें, आप बेहतर जानते हैं कि आप सुरक्षा के साथ क्या कर रहे हैं।
naXa

हाँ, यह काम किया। मैं केवल स्वैगर-उई को दरकिनार करने के बारे में सोच रहा था, लेकिन अन्य एपीआई सुरक्षित है। अब मेरे API भी बायपास हो गए हैं।
चंद्रकांत औधुतवार

@ChandrakantAudhutwar आपको SecurityConfigurationअपनी परियोजना के लिए पूरी कक्षा को कॉपी-पेस्ट करने की आवश्यकता नहीं है । आपके पास अपना स्वयं का होना चाहिए SecurityConfigurationजहां आप स्वैगर यूआई संसाधनों के लिए अनुरोध करते हैं और अपने एपीआई को सुरक्षित रखते हैं।
naXa

मैंने वह AuthorizationServerConfigurerAdapterवर्ग लागू किया है जो एपीआई का प्रमाणीकरण करता है।
चंद्रकांत औधुतवार

14

उन लोगों के लिए जो एक नया स्वैगर 3 संस्करण का उपयोग करते हैं 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/**");
    }
}

2
नोट: यदि यह आपको "प्रमाणीकरण आवश्यक" त्रुटि प्राप्त करने से रोकता है, लेकिन आपको केवल एक खाली पृष्ठ दिखाता है, तो मुझे उस सूची में "/ स्वैगर-संसाधन / **" और "/ स्वैगर-संसाधन" भी जोड़ना होगा और इसे ठीक कर दिया जाएगा यह मेरे लिए है।
विनियस एम।

6

यदि आपका स्प्रिंगफॉक्स संस्करण 2.5 higher से अधिक है, तो नीचे दिए अनुसार WebSecurityConfiguration को जोड़ना चाहिए:

@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 सही है, क्योंकि स्प्रिंगफॉक्स 2.5+ के बाद से, सभी स्प्रिंगफॉक्स संसाधन (स्वैगर शामिल) नीचे चले गए हैं /swagger-resources/v2/api-docs(यूआई के साथ कोई चिंता का विषय) डिफ़ॉल्ट अकड़ एपीआई अंत बिंदु है, जो config चर साथ अधिरोहित जा सकता है springfox.documentation.swagger.v2.path springfox
Mahieddine एम Ichir

4

कमोबेश इस पृष्ठ के उत्तर हैं लेकिन सभी एक स्थान पर नहीं हैं। मैं उसी मुद्दे से निपट रहा था और उस पर काफी अच्छा समय बिता रहा था। अब मेरे पास एक बेहतर समझ है और मैं इसे यहां साझा करना चाहूंगा:

मैं वसंत websecurity के साथ स्वैगर ui को सक्षम करना:

यदि आपने डिफ़ॉल्ट रूप से स्प्रिंग वेबसिटी को सक्षम किया है तो यह आपके आवेदन के सभी अनुरोधों को अवरुद्ध कर देगा और 401 लौटा देगा। हालांकि, स्वैगर ui के लिए ब्राउज़र में लोड करने के लिए- ui.html डेटा एकत्र करने के लिए कई कॉल करता है। डीबग करने का सबसे अच्छा तरीका एक ब्राउज़र (Google क्रोम की तरह) में swagger-ui.html है और डेवलपर विकल्प ('F12' कुंजी) का उपयोग करें। पेज लोड होने पर आप कई कॉल देख सकते हैं और अगर स्वैगर-यूआई पूरी तरह से लोड नहीं हो रहा है, तो उनमें से कुछ विफल हो रहे हैं।

आपको कई स्वैगर पथ पैटर्न के लिए प्रमाणीकरण को अनदेखा करने के लिए स्प्रिंग वीबसिटी को बताने की आवश्यकता हो सकती है। मैं स्वैगर-यूआई 2.9.2 का उपयोग कर रहा हूं और मेरे मामले में नीचे दिए गए पैटर्न हैं जिन्हें मुझे अनदेखा करना था:

हालाँकि यदि आप किसी भिन्न संस्करण का उपयोग कर रहे हैं तो आपके परिवर्तन हो सकते हैं। जैसा कि मैंने पहले कहा था कि आपको अपने ब्राउज़र में डेवलपर विकल्प के साथ अपना पता लगाना होगा।

@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 इंटरसेप्टर के साथ स्वैगर ui को सक्षम करना

आम तौर पर आप स्वैगर-ui.html द्वारा किए गए अनुरोधों को रोकना नहीं चाह सकते हैं। नीचे दिए गए स्वैगर के कई पैटर्न को बाहर करने के लिए कोड है:

अधिकांश मामलों में वेब सुरक्षा और इंटरसेप्टर के लिए पैटर्न समान होंगे।

@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 को सक्षम करना पड़ सकता है इसलिए आपको उपरोक्त कोड स्निपेट में किए गए समान के लिए संसाधन हैंडलर भी जोड़ना पड़ सकता है।


आप /csrfबहिष्करण में क्यों जोड़ रहे हैं ?
विशाल

2

केवल स्वैगर संबंधित संसाधनों तक सीमित:

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

2

यहां स्प्रिंग सिक्योरिटी के साथ स्वैगर का पूरा समाधान है । हम शायद अपने विकास और क्यूए वातावरण में केवल स्वैगर को सक्षम करना चाहते हैं और इसे उत्पादन वातावरण में अक्षम कर सकते हैं। इसलिए, मैं prop.swagger.enabledकेवल विकास / क्यूए वातावरण में स्वैगर-यूआई के लिए वसंत सुरक्षा प्रमाणीकरण को बायपास करने के लिए एक संपत्ति के रूप में एक संपत्ति का उपयोग कर रहा हूं ।

@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

मैं स्प्रिंग बूट 5 का उपयोग कर रहा हूं। मेरे पास यह नियंत्रक है कि मैं एक अनधिकृत उपयोगकर्ता को आमंत्रित करना चाहता हूं।

  //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();

यहाँ मैंने विन्यास में क्या किया है।

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

उम्मीद है की यह मदद करेगा....


1

कुछ सुरक्षा कॉन्फ़िगरेशन और आप सभी के लिए खुले स्वैगर के साथ तैयार हैं

स्वैगर V2 के लिए

@Configuration
@EnableWebSecurity
public class CabSecurityConfig extends WebSecurityConfigurerAdapter {


    private static final String[] AUTH_WHITELIST = {
            // -- swagger ui
            "/v2/api-docs", 
            "/swagger-resources/**", 
            "/configuration/ui",
            "/configuration/security", 
            "/swagger-ui.html",
            "/webjars/**"
    };

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        // ... here goes your custom security configuration
        http.authorizeRequests().
        antMatchers(AUTH_WHITELIST).permitAll(). // whitelist URL permitted
        antMatchers("/**").authenticated(); // others need auth
    }

}

स्वैगर V3 के लिए

@Configuration
@EnableWebSecurity
public class CabSecurityConfig extends WebSecurityConfigurerAdapter {


    private static final String[] AUTH_WHITELIST = {
            // -- swagger ui
            "/v2/api-docs",
            "/v3/api-docs",  
            "/swagger-resources/**", 
            "/swagger-ui/**",
             };

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        // ... here goes your custom security configuration
        http.authorizeRequests().
        antMatchers(AUTH_WHITELIST).permitAll(). // whitelist URL permitted
        antMatchers("/**").authenticated(); // others need auth
    }

}

0

/api/..नीचे दिए गए कॉन्फ़िगरेशन का उपयोग करके केवल इस url पैटर्न को सुरक्षित करने के लिए आप अपने url पैटर्न के साथ स्थित अपने API अनुरोधों को ध्यान में रखते हुए वसंत को बता सकते हैं। जिसका मतलब है कि आप वसंत को बता रहे हैं कि क्या अनदेखा करने के बजाय सुरक्षित करना है।

@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
इस कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित अल्पकालिक सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि यह समस्या का एक अच्छा समाधान क्यों है, यह दिखाते हुए इसके दीर्घकालिक मूल्य में बहुत सुधार करेगा , और यह भविष्य के पाठकों को अन्य, समान प्रश्नों के साथ और अधिक उपयोगी बना देगा। कृपया कुछ स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें, जिसमें आपके द्वारा की गई धारणाएँ शामिल हैं।
टोबे स्पाइट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.