প্রমাণীকরণ ব্যতীত সোগার URL টি অ্যাক্সেস করার অনুমতি দিতে কীভাবে স্প্রিং সুরক্ষা কনফিগার করা যায়


92

আমার প্রকল্পের স্প্রিং সিকিউরিটি রয়েছে। মূল সমস্যা: http: // লোকালহোস্ট: 8080 / এপিআই / ভি 2 / এপিআই-ডক্সে সোয়াগার URL অ্যাক্সেস করতে সক্ষম নয় । এটি মিসিং বা অবৈধ অনুমোদনের শিরোনাম বলে।

ব্রাউজার উইন্ডোটির স্ক্রিনশট আমার পম.এক্সএমএল-এর নিম্নলিখিত এন্ট্রি রয়েছে

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

অ্যাপকনফিগ:

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

ওয়েব.এক্সএমএল এন্ট্রি:

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

ওয়েবসিকিউরিটি কনফিগ:

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

উত্তর:


176

আপনার ওয়েবসিকিউরিটি কনফিগারেশন ক্লাসে এটি যুক্ত করার কৌশলটি করা উচিত।

@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", "/ swagger- উত্স", "/ কনফিগারেশন / সুরক্ষা", "/ swagger-ui .html "," / ওয়েবজার / ** "," / সোয়াগার-রিসোর্স / কনফিগারেশন / ইউআই "," / সোয়াগার-ইউআই এইচটিএমএল ")। পারমিটআল ()
ড্যানিয়েল

4
আমার ক্ষেত্রে এই বিধিটি কাজ করছে: .antMatchers ("/ v2 / api-docs", "/ কনফিগারেশন / ui", "/ swagger- রিসোর্স", "/ কনফিগারেশন / সুরক্ষা", "/swagger-ui.html", "/ ওয়েবজার / **", "/ সোয়াগার-রিসোর্স / কনফিগারেশন / ইউআই", "/ সোয়াগে র আর ইউআই এইচটিএমএল", "/ সোয়াগার-রিসোর্সেস / কনফিগারেশন / সিকিউরিটি")। পারমিটআল ()
নিকোলাই.সেরিউডুক

6
আরও নিয়মের দরকার পড়ে: .antMatchers ("/", "/ csrf", "/ v2 / api-docs", "/ swagger- রিসোর্স / কনফিগারেশন / ui", "/ কনফিগারেশন / ui", "/ স্ব্যাগার-রিসোর্স", "/ সোয়াগার-রিসোর্স / কনফিগারেশন / সুরক্ষা", "/ কনফিগারেশন / সুরক্ষা", "/swagger-ui.html", "/ ওয়েবজার / **")। পারমিটআল ()
সাথ Šimović

4
উত্তর করার জন্য ধন্যবাদ! ওয়েবজার / ** অ্যাক্সেসের অনুমতি দেওয়ার মতো কোনও সুরক্ষা ঝুঁকি রয়েছে?
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/**");

}

পারফেক্ট! বিষয়টি সমাধান করেছেন।
মধু

24

স্প্রিং বুট 2.0.0.M7 + স্প্রিং সিকিউরিটি + স্প্রিংফক্স 2.8.0 ব্যবহার করে আমার একই সমস্যা হয়েছিল। এবং আমি নিম্নলিখিত সুরক্ষা কনফিগারেশন ব্যবহার করে সমস্যার সমাধান করেছি যা সোয়াগার ইউআই সংস্থানগুলিতে জনসাধারণের অ্যাক্সেসের অনুমতি দেয়।

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

}

4
এই শ্রেণিটি যুক্ত করার পরে, আমি সোয়াগার-ইউআই দেখতে পাচ্ছি তবে নীচে নীচে { "timestamp": 1519798917075, "status": 403, "error": "Forbidden", "message": "Access Denied", "path": "/<some path>/shop" }
অ্যাসেস

@ চন্দ্রকান্ত আউদুটোয়ার antMatchers("/**").authenticated()স্টেটমেন্ট মুছুন বা আপনার নিজস্ব প্রমাণীকরণের কনফিগারেশনটি প্রতিস্থাপন করুন। সতর্কতা অবলম্বন করুন, আপনি সুরক্ষা দিয়ে কী করছেন তা আপনি আরও ভাল জানেন।
নেক্সা

হ্যাঁ, এটা কাজ করেছে আমি কেবল সোয়াগার-ইউআইকে বাইপাস করার কথা ভাবছিলাম, তবে এটি সুরক্ষিত হওয়ায় অন্যান্য API গুলি। এখন আমার এপিআইগুলিও বাইপাস করা হয়েছে।
চন্দ্রকান্ত অধুত্বর

@ চন্দ্রকান্ত অউদুটোয়ার SecurityConfigurationআপনার প্রকল্পে পুরো ক্লাসটি অনুলিপি করার দরকার নেই । আপনি SecurityConfigurationসোয়াগার ইউআই সংস্থানগুলিতে অনুরোধের অনুমতি দেওয়ার এবং আপনার এপিআইগুলিকে সুরক্ষিত রাখার জন্য আপনার নিজের থাকতে হবে।
naXa

আমি AuthorizationServerConfigurerAdapterক্লাস প্রয়োগ করেছি যা এপিআই'র প্রমাণীকরণ করে।
চন্দ্রকান্ত অধুত্বর

12

যারা নতুন swagger 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/**");
    }
}

4
দ্রষ্টব্য: এটি যদি আপনাকে "প্রমাণীকরণের প্রয়োজনীয়তা" ত্রুটি পেতে বাধা দেয় তবে কেবল একটি ফাঁকা পৃষ্ঠা দেখায়, আমাকে সেই তালিকায় "/ swagger-संसाधन / **" এবং "/ swagger-સંપત્તિ" যুক্ত করতে হবে এবং এটি স্থির হয়েছে এটা আমার জন্য
ভিনসিয়াস এম

5

যদি আপনার স্প্রিংফক্স সংস্করণটি 2.5 than এর চেয়ে বেশি হয় তবে নীচের মতো ওয়েবসিকিউরিটি কনফিগারেশন যুক্ত করা উচিত:

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

ডুলিউ ১৯৯৯ ঠিক আছে, যেহেতু স্প্রিংফক্স 2.5+, সমস্ত স্প্রিংফক্স সংস্থান (স্বাগর অন্তর্ভুক্ত) এর অধীনে চলে গেছে /swagger-resources/v2/api-docs(UI 'তে সঙ্গে কোন উদ্বেগের বিষয়) ডিফল্ট ঝকঝকে API শেষবিন্দু, যা কনফিগ পরিবর্তনশীল সঙ্গে ওভাররাইড করা যেতে পারে springfox.documentation.swagger.v2.path springfox
Mahieddine এম Ichir

3

কম-বেশি এই পৃষ্ঠার উত্তর রয়েছে তবে সমস্ত এক জায়গায় নেই। আমি একই সমস্যা নিয়ে কাজ করছিলাম এবং এটিতে বেশ ভাল সময় ব্যয় করেছি। এখন আমার আরও ভাল ধারণা হয়েছে এবং আমি এখানে এটি ভাগ করতে চাই:

আমি স্প্রিং ওয়েবসিকিউরিটির সাহায্যে সোয়াগার ইউআই সক্ষম করছি:

আপনি যদি স্প্রিং ওয়েবসিকিউরিটি ডিফল্টরূপে সক্ষম করে থাকেন তবে এটি আপনার আবেদনের সমস্ত অনুরোধগুলি ব্লক করবে এবং 401 ফেরত দেবে। তবে সোয়াগার ইউআইয়ের জন্য ব্রাউজারে লোড হওয়ার জন্য সোয়াগার-ui.html ডেটা সংগ্রহ করার জন্য বেশ কয়েকটি কল করে several ডিবাগ করার সর্বোত্তম উপায় হ'ল ব্রাউজারে খোলা swagger-ui.html (যেমন গুগল ক্রোম) এবং বিকাশকারী বিকল্পগুলি ('F12' কী) ব্যবহার করুন। পৃষ্ঠাটি লোড হয়ে যাওয়ার পরে আপনি বেশ কয়েকটি কল দেখতে পাবেন এবং যদি সোয়াগার-ইউআই পুরোপুরি লোড হচ্ছে না তবে সম্ভবত তাদের মধ্যে কিছু ব্যর্থ হচ্ছে।

বেশ কয়েকটি সোয়াগার পাথের নিদর্শনগুলির জন্য প্রমাণীকরণ উপেক্ষা করার জন্য আপনাকে বসন্তের ওয়েবসিকিউরিটি বলতে হবে। আমি সোয়াগার-ইউআই ২.৯.২ ব্যবহার করছি এবং আমার ক্ষেত্রে নীচে আমার যে প্যাটার্নগুলি উপেক্ষা করতে হয়েছিল তা হল:

তবে আপনি যদি আলাদা সংস্করণ ব্যবহার করেন তবে আপনার পরিবর্তন হতে পারে। আমি আগে যেমন বলেছিলাম তেমন আপনাকে আপনার ব্রাউজারে বিকাশকারী বিকল্পের সাহায্যে খুঁজে বের করতে হবে।

@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.html দ্বারা তৈরি করা অনুরোধগুলি আটকাতে নাও চাইবেন। নীচে swagger বিভিন্ন নিদর্শন বাদ দিতে কোড:

ওয়েব সুরক্ষা এবং ইন্টারসেপ্টারের ক্ষেত্রে বেশিরভাগ কেস প্যাটার্ন একই হবে same

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

}

যেহেতু আপনাকে উপরের কোড স্নিপেটের মতো স্যাগার করতে রিসোর্স হ্যান্ডলার যুক্ত করতে হতে পারে আপনাকে ইন্টারসেপ্টর যুক্ত করতে @EableWebMvc সক্ষম করতে হতে পারে।


/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 ব্যবহার করছি I আমার কাছে এই নিয়ামকটি রয়েছে যে আমি একটি অচিহ্নিত ব্যবহারকারীকে প্রার্থনা করতে চাই।

  //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",

আশাকরি এটা সাহায্য করবে....


0

আপনার সমস্ত url টির অনুরোধ বিবেচনা করে আপনার url প্যাটার্নের সাথে থাকা /api/..নীচে কনফিগারেশন ব্যবহার করে কেবল এই url প্যাটার্নটি সুরক্ষিত করতে বসন্তকে বলতে পারেন। যার অর্থ আপনি বসন্তকে কী উপেক্ষা করবেন তার পরিবর্তে কী সুরক্ষিত করবেন তা বলছেন।

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

4
এই কোড স্নিপেটের জন্য আপনাকে ধন্যবাদ, যা কিছু সীমিত স্বল্পমেয়াদী সহায়তা সরবরাহ করতে পারে। একটি সঠিক ব্যাখ্যা কেন এটি সমস্যার একটি ভাল সমাধান তা দেখিয়ে তার দীর্ঘমেয়াদী মানকে ব্যাপকভাবে উন্নত করবে এবং ভবিষ্যতে পাঠকদের আরও অন্যান্য অনুরূপ প্রশ্নের সাথে আরও দরকারী করে তুলবে। আপনার অনুমানগুলি সহ কিছু ব্যাখ্যা যুক্ত করতে দয়া করে আপনার উত্তরটি সম্পাদনা করুন।
টবি স্পিড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.