वसंत बूट और कोणीय के साथ कोर काम नहीं कर रहा है


87

मैं दूसरे (angularjs) से एक एप्लिकेशन (स्प्रिंग-बूट एप्लिकेशन) पर REST के समापन बिंदुओं को कॉल करने का प्रयास कर रहा हूं। अनुप्रयोग निम्न होस्ट और पोर्ट पर चल रहे हैं।

  • REST एप्लिकेशन, स्प्रिंग बूट का उपयोग करते हुए, http://localhost:8080
  • HTML एप्लिकेशन, कोणीयज का उपयोग करते हुए, http://localhost:50029

मैं spring-securityस्प्रिंग-बूट एप्लिकेशन के साथ भी उपयोग कर रहा हूं । HTML एप्लिकेशन से, मैं REST एप्लिकेशन को प्रमाणित कर सकता हूं, लेकिन, इसके बाद भी, मैं अभी तक किसी भी अन्य REST बिंदु तक नहीं पहुंच सकता। उदाहरण के लिए, मेरे पास एक कोणीयज सेवा इस प्रकार परिभाषित है।

adminServices.factory('AdminService', ['$resource', '$http', 'conf', function($resource, $http, conf) {
    var s = {};
    s.isAdminLoggedIn = function(data) {
        return $http({
            method: 'GET',
            url: 'http://localhost:8080/api/admin/isloggedin',
            withCredentials: true,
            headers: {
                'X-Requested-With': 'XMLHttpRequest'
            }
        });
    };
    s.login = function(username, password) {
        var u = 'username=' + encodeURI(username);
        var p = 'password=' + encodeURI(password);
        var r = 'remember_me=1';
        var data = u + '&' + p + '&' + r;

        return $http({
            method: 'POST',
            url: 'http://localhost:8080/login',
            data: data,
            headers: {'Content-Type': 'application/x-www-form-urlencoded'}
        });
    };
    return s;
}]);

कोणीयर्ज नियंत्रक निम्न की तरह दिखता है।

adminControllers.controller('LoginController', ['$scope', '$http', 'AdminService', function($scope, $http, AdminService) {
    $scope.username = '';
    $scope.password = '';

    $scope.signIn = function() {
        AdminService.login($scope.username, $scope.password)
            .success(function(d,s) {
                if(d['success']) {
                    console.log('ok authenticated, call another REST endpoint');
                    AdminService.isAdminLoggedIn()
                        .success(function(d,s) {
                            console.log('i can access a protected REST endpoint after logging in');
                        })
                        .error(function(d, s) { 
                            console.log('huh, error checking to see if admin is logged in');
                            $scope.reset();
                        });
                } else {
                    console.log('bad credentials?');
                }
            })
            .error(function(d, s) {
                console.log('huh, error happened!');
            });
    };
}]);

कॉल करने पर http://localhost:8080/api/admin/isloggedin, मुझे एक मिलता है 401 Unauthorized

REST एप्लिकेशन पक्ष में, मेरे पास एक CORS फ़िल्टर है जो निम्न की तरह दिखता है।

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CORSFilter implements Filter {

    @Override
    public void destroy() { }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;

        response.setHeader("Access-Control-Allow-Origin", "http://localhost:50029");
        response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "X-Requested-With, X-Auth-Token");
        response.setHeader("Access-Control-Allow-Credentials", "true");

        if(!"OPTIONS".equalsIgnoreCase(request.getMethod())) {
            chain.doFilter(req, res);
        }
    }

    @Override
    public void init(FilterConfig config) throws ServletException { }
}

मेरा स्प्रिंग सुरक्षा कॉन्फ़िगरेशन निम्न की तरह दिखता है।

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private RestAuthenticationEntryPoint restAuthenticationEntryPoint;

    @Autowired
    private JsonAuthSuccessHandler jsonAuthSuccessHandler;

    @Autowired
    private JsonAuthFailureHandler jsonAuthFailureHandler;

    @Autowired
    private JsonLogoutSuccessHandler jsonLogoutSuccessHandler;

    @Autowired
    private AuthenticationProvider authenticationProvider;

    @Autowired
    private UserDetailsService userDetailsService;

    @Autowired
    private PersistentTokenRepository persistentTokenRepository;

    @Value("${rememberme.key}")
    private String rememberMeKey;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .exceptionHandling()
            .authenticationEntryPoint(restAuthenticationEntryPoint)
                .and()
            .authorizeRequests()
                .antMatchers("/api/admin/**").hasRole("ADMIN")
                .antMatchers("/", "/admin", "/css/**", "/js/**", "/fonts/**", "/api/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .successHandler(jsonAuthSuccessHandler)
                .failureHandler(jsonAuthFailureHandler)
                .permitAll()
                .and()
            .logout()
                .deleteCookies("remember-me", "JSESSIONID")
                .logoutSuccessHandler(jsonLogoutSuccessHandler)
                .permitAll()
                .and()
            .rememberMe()
                .userDetailsService(userDetailsService)
                .tokenRepository(persistentTokenRepository)
                .rememberMeCookieName("REMEMBER_ME")
                .rememberMeParameter("remember_me")
                .tokenValiditySeconds(1209600)
                .useSecureCookie(false)
                .key(rememberMeKey);
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .authenticationProvider(authenticationProvider);
    }
}

सभी हैंडलर कर रहे हैं जैसे कि JSON प्रतिक्रिया लिख ​​रहा है जैसे {success: true}कि उपयोगकर्ता लॉग इन किया गया, प्रमाणित करने में विफल रहा, या लॉग आउट किया गया। RestAuthenticationEntryPointदिखता है निम्नलिखित की तरह।

@Component
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {

    @Override
    public void commence(HttpServletRequest req, HttpServletResponse resp, AuthenticationException ex)
            throws IOException, ServletException {
        resp.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
    }

}

क्या मैं याद कर रहा हूँ या गलत कर रहा हूँ पर कोई विचार?


मुझे लगता है कि आपको एक टोकन या किसी चीज़ की तरह प्रमाणीकरण को पूरा करने की आवश्यकता है। आपके पास 2 सर्वर हैं। क्या आपने उस ट्यूटोरियल को देखा? spring.io/guides/tutorials/spring-security-and-angular-js
गोखन ओनर

@GokhanOner मैं प्रमाणीकरण कैसे ले सकता हूं? शायद इस समस्या के लिए लापता टुकड़ा है। इसके अलावा, हाँ, मैं उन ट्यूटोरियल के माध्यम से गया था और मुझे नहीं लगा कि वे मेरे दृष्टिकोण के साथ संरेखित थे। पहले दो भाग Http- बेसिक ऑथेंटिकेशन से निपटा, फिर तीसरा हिस्सा रेडिस के साथ निपटा (मैं एक निर्भरता के रूप में इसे पाने की योजना नहीं करना चाहता था), और फिर आखिरी ट्यूटोरियल API Gatewayस्प्रिंग क्लाउड के साथ था , जिसके बारे में मुझे लगा कि यह ओवरऑल ऑफर है ।
जेन वेन

मुझे लगता है कि आप इसे रेडिस के बिना कर सकते हैं, यह सिर्फ एक कुंजी-मूल्य कैश स्टोर है। आपको एक स्टोर पर प्रमाणीकरण और सीएसआरएफ टोकन को स्टोर करने की आवश्यकता है, जो कि मक्खी पर मानचित्र के अंदर संभव है। यहाँ मुख्य बात प्रमाणीकरण कुंजी है। उदाहरण के लिए देखें: github.com/dsyer/spring-security-angular/tree/master/… और "संसाधन सर्वर" वाले पृष्ठ। आप कुछ अतिरिक्त बीन्स को परिभाषित देखेंगे, कोर के फ़िल्टर का क्रम भी महत्वपूर्ण है। और कुछ प्रोप। परिवर्तन भी आवश्यक है।
गोखन ओनर

ठीक है, मैंने एक त्वरित शोध किया। रेडिस से छुटकारा पाने के लिए आपको बस एक स्प्रिंगसेशन रिपॉजिटरीफिल्टर बीन को उबालना है, github.com/spring-projects/spring-session/blob/1.0.0.RC1/… पर देखें , और सेशन रिपॉजिटरी बीन और इस बीन में भी। RedisOperationsSessionRepository के बजाय, आप MapSessionRepository का उपयोग कर सकते हैं, जो कि वसंत-सत्र में भी है। और फिर उदाहरण का पालन करें।
गोखन ओनर

जवाबों:


104
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class SimpleCORSFilter implements Filter {

private final Logger log = LoggerFactory.getLogger(SimpleCORSFilter.class);

public SimpleCORSFilter() {
    log.info("SimpleCORSFilter init");
}

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
    response.setHeader("Access-Control-Allow-Credentials", "true");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me");

    chain.doFilter(req, res);
}

@Override
public void init(FilterConfig filterConfig) {
}

@Override
public void destroy() {
}

}

इस फिल्टर को जोड़ने के लिए अतिरिक्त परिभाषित करने की आवश्यकता नहीं है। वसंत स्कैन किया जाएगा और इसे आपके लिए जोड़ देगा। SimpleCORSFilter। यहाँ उदाहरण है: वसंत-सक्षम-कोर


कुछ प्रश्न। 1) मैं स्ट्रिंग स्थिरांक कहाँ रखने वाला हूँ HEADERSऔर X_REDIRECT_LOCATION_HEADER? 2) क्या लाइन request.getRequestURL());टाइपो या कॉपी / पेस्ट गलती है? 3) आप OPTIONSफ़िल्टर श्रृंखला के लिए जाँच क्यों नहीं करते ?
जेन वेन

2
लेकिन यह AuthenticationEntryPoint को निष्पादित करने के लिए ब्लॉक करता है .. कृपया मार्गदर्शन करें
Pra_A

1
आपका बहुत-बहुत धन्यवाद, इसने मुझे वसंत और अंगारे के साथ मिलकर काम करने के अपने संघर्ष में बहुत मदद की। चीयर्स दोस्त!
टॉमस सिजेनिक

FindBugs हेडर पैरामीटर सेट करना पसंद नहीं करता है: request.getHeader("Origin")जैसा कि HTTP प्रतिक्रिया विभाजन के
Glenn

3
यदि आपके एप्लिकेशन में अन्य फ़िल्टर हैं, तो फ़िल्टर को एनोटेट करके इस फ़िल्टर को सबसे अधिक पूर्ववर्ती होना चाहिए @Order(Ordered.HIGHEST_PRECEDENCE)
शफीउल

44

मैं भी ऐसी ही स्थिति में था। अनुसंधान और परीक्षण करने के बाद, यहाँ मेरा निष्कर्ष है:

  1. स्प्रिंग बूट के साथ, वैश्विक कॉर्स को सक्षम करने का अनुशंसित तरीका स्प्रिंग एमवीसी के भीतर घोषित करने और ठीक-ठीक @CrossOriginकॉन्फ़िगरेशन के साथ संयुक्त करने के लिए है :

    @Configuration
    public class CorsConfig {
    
        @Bean
        public WebMvcConfigurer corsConfigurer() {
            return new WebMvcConfigurerAdapter() {
                @Override
                public void addCorsMappings(CorsRegistry registry) {
                    registry.addMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE").allowedOrigins("*")
                            .allowedHeaders("*");
                }
            };
        }
    }
    
  2. अब, चूंकि आप स्प्रिंग सिक्योरिटी का उपयोग कर रहे हैं, इसलिए आपको स्प्रिंग सुरक्षा स्तर पर कॉर्स को सक्षम करना होगा और साथ ही इसे स्प्रिंग एमवीसी स्तर पर परिभाषित कॉन्फ़िगरेशन का लाभ उठाने की अनुमति देना होगा:

    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.cors().and()...
        }
    }
    

    स्प्रिंग एमवीसी ढांचे में कॉर्स समर्थन की व्याख्या करने वाला बहुत ही उत्कृष्ट ट्यूटोरियल यहां दिया गया है।


3
यह इस परिवर्तन के साथ काम करता है http .csrf () .disable () .cors () (.and) ()
marti_

1
यह सुनकर अच्छा लगा कि :) मैं जब से प्राधिकरण के लिए JWT का उपयोग कर रहा हूं और वे csrf सुरक्षित हैं, मैंने वहां नहीं डाला .. अगर मदद मिली तो इसे आगे बढ़ाना न भूलें :)
Yogen Ri

yep मैंने
marti_

@ मार्सेल यू क्या मुद्दा हो रहा है?
योजन राय

लोड करने में विफल <मेरे बाकी पते>: पूर्व-अनुरोध अनुरोध का जवाब एक्सेस कंट्रोल चेक पास नहीं करता है: अनुरोधित संसाधन पर कोई 'एक्सेस-कंट्रोल-अनुमति-उत्पत्ति' हेडर मौजूद नहीं है। उत्पत्ति ' लोकलहोस्ट: 8090 ' को इसलिए प्रवेश की अनुमति नहीं है।
मार्सेल

22

यदि आप फ़िल्टर का उपयोग किए बिना या बिना कॉन्फ़िगर फ़ाइल के केवल कॉर्स को सक्षम करना चाहते हैं तो जोड़ें

@CrossOrigin

अपने नियंत्रक के शीर्ष पर और यह काम करता है।


4
इस दृष्टिकोण का पालन करके सुरक्षा जोखिम क्या है?
बालाजी विग्नेश

मेरे लिए काम किया, मैंने सीधे प्रतिक्रिया के लिए हेडर जोड़ने की कोशिश की, लेकिन यह काम नहीं किया क्योंकि प्रीफ्लाइट को संभाला नहीं गया था। मुझे लगता है कि यह सुरक्षित नहीं है, लेकिन इस्तेमाल किया जा सकता है कुछ आंतरिक अनुप्रयोग हैं।
19

मेरे लिए काम किया। आंतरिक अनुप्रयोग के लिए बहुत आसान समाधान।
अजय कुमार

8

ऊपर दिए गए अन्य उत्तरों पर निर्माण करने के लिए, यदि आपके पास स्प्रिंग सुरक्षा के साथ स्प्रिंग बूट रीस्ट सर्विस एप्लिकेशन (स्प्रिंग एमवीसी नहीं) है, तो स्प्रिंग सुरक्षा के माध्यम से कॉर्स को सक्षम करना पर्याप्त है (यदि आप स्प्रिंग एमवीसी का उपयोग करते हैं तो एक WebMvcConfigurerबीन का उपयोग करके जैसा कि Yogen द्वारा उल्लेख किया जा सकता है) वसंत सुरक्षा के रूप में जाने का रास्ता उसमें वर्णित CORS परिभाषा को प्रस्तुत करेगा)

तो आपको एक सिक्योरिटी कॉन्फिगर करना होगा जो निम्न कार्य करे:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
    //other http security config
    http.cors().configurationSource(corsConfigurationSource());
}

//This can be customized as required
CorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration configuration = new CorsConfiguration();
    List<String> allowOrigins = Arrays.asList("*");
    configuration.setAllowedOrigins(allowOrigins);
    configuration.setAllowedMethods(singletonList("*"));
    configuration.setAllowedHeaders(singletonList("*"));
    //in case authentication is enabled this flag MUST be set, otherwise CORS requests will fail
    configuration.setAllowCredentials(true);
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}

}

इस लिंक पर अधिक जानकारी है: https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#cors

ध्यान दें:

  1. सभी मूल (*) के लिए कोर को सक्षम करने के लिए एक तैनात आवेदन हमेशा एक अच्छा विचार नहीं हो सकता है।
  2. CSRF को बिना किसी समस्या के स्प्रिंग HttpSecurity अनुकूलन के माध्यम से सक्षम किया जा सकता है
  3. यदि आपके पास स्प्रिंग ( UserDetailsServiceउदाहरण के लिए) के साथ ऐप में प्रमाणीकरण सक्षम है, तो configuration.setAllowCredentials(true);जोड़ना होगा

वसंत बूट के लिए परीक्षण किया गया 2.0.0। जारी (यानी, वसंत 5.0.4। कृपया और वसंत सुरक्षा 5.0.3। कृपया)


इससे मेरी समस्या हल हो गई। स्प्रिंग और स्प्रिंग बूट के नए होने के नाते, मुझे एहसास हुआ कि मैं श्रृंग एमवीसी के साथ निर्माण नहीं कर रहा था। मेरे पास एक Vue.js क्लाइंट था। अन्य उत्तर स्प्रिंग एमवीसी के लिए लग रहे थे, लेकिन यह उत्तर मेरे पहले से ही लागू प्रमाणीकरण और प्राधिकरण के साथ अच्छी तरह से जुड़ा हुआ था।
जलेटेक

हाय @jaletechs, मैं भी nuxtJs (एक vuejs ढांचे) का उपयोग कर रहा हूँ, लेकिन जब यह कुकी स्थापित करने की बात आती है, तो यह काम नहीं कर रहा है। क्या आप इस पर मदद करने के लिए पर्याप्त होंगे।
केमित

6

Im का उपयोग करना spring boot 2.1.0और मेरे लिए क्या काम किया गया था

A. द्वारा कोर्सेस मैपिंग जोड़ें:

@Configuration
public class Config implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedOrigins("*");
    }
}

HttpSecurityवसंत सुरक्षा के लिए मेरे लिए नीचे विन्यास जोड़ें

.cors().configurationSource(new CorsConfigurationSource() {

    @Override
    public CorsConfiguration getCorsConfiguration(HttpServletRequest request) {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowedHeaders(Collections.singletonList("*"));
        config.setAllowedMethods(Collections.singletonList("*"));
        config.addAllowedOrigin("*");
        config.setAllowCredentials(true);
        return config;
    }
})

ज़ूलुल प्रॉक्सी के मामले में भी आप ए और बी के इनस्टैड का उपयोग कर सकते हैं (बस HttpSecurity.cors()इसे वसंत सुरक्षा में सक्षम करने के लिए उपयोग करें):

@Bean
public CorsFilter corsFilter() {
    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    final CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("OPTIONS");
    config.addAllowedMethod("HEAD");
    config.addAllowedMethod("GET");
    config.addAllowedMethod("PUT");
    config.addAllowedMethod("POST");
    config.addAllowedMethod("DELETE");
    config.addAllowedMethod("PATCH");
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
}

नया CorsFilter (स्रोत) लौटाएं; ऐसी
रचनाकार

@ आदम आप स्प्रिंग बूट के एक ही संस्करण का उपयोग कर रहे हैं जैसा कि मैं करता हूं?
Sep GH

2.1.5 उपयोग में है
आदम

@ आधार कृपया सुनिश्चित करें कि आप CorsFilter का उपयोग कर रहे हैं org.springframework.web.filter.CorsFilter। मेरे पास एक ही मुद्दा था जबकि मैंने इसे कैटेलिना पैकेज से गलती से इस्तेमाल किया था।
सिपाही GH

5

यह मेरे लिए काम करता है:

@Configuration
public class MyConfig extends WebSecurityConfigurerAdapter  {
   //...
   @Override
   protected void configure(HttpSecurity http) throws Exception {

       //...         

       http.cors().configurationSource(new CorsConfigurationSource() {

        @Override
        public CorsConfiguration getCorsConfiguration(HttpServletRequest request) {
            CorsConfiguration config = new CorsConfiguration();
            config.setAllowedHeaders(Collections.singletonList("*"));
            config.setAllowedMethods(Collections.singletonList("*"));
            config.addAllowedOrigin("*");
            config.setAllowCredentials(true);
            return config;
        }
      });

      //...

   }

   //...

}

हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन यह कोड क्यों और / या इस बारे में अतिरिक्त संदर्भ प्रदान करता है कि यह प्रश्न इसके दीर्घकालिक मूल्य में सुधार करता है।
एड्रियानो मार्टिंस

1
यदि प्रमाणन वसंत सुरक्षा के माध्यम से सक्षम है, तो config.setAllowCredentials (सच); अन्यथा डाल दिया जाना चाहिए, लेकिन कोर के अनुरोध अभी भी विफल रहेंगे
दीपक

2

मेरे लिए केवल एक चीज जो 100% काम करती थी, जब वसंत सुरक्षा का उपयोग किया जाता है, अतिरिक्त फिल्टर और बीन्स के सभी अतिरिक्त फुलाना को छोड़ना और जो भी अप्रत्यक्ष "जादू" लोग सुझाव देते रहे कि उनके लिए काम किया है, लेकिन मेरे लिए नहीं।

इसके बजाय सिर्फ एक हेडर को सादे के साथ लिखने के लिए मजबूर करें StaticHeadersWriter:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

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

        http
            // your security config here
            .authorizeRequests()
            .antMatchers(HttpMethod.TRACE, "/**").denyAll()
            .antMatchers("/admin/**").authenticated()
            .anyRequest().permitAll()
            .and().httpBasic()
            .and().headers().frameOptions().disable()
            .and().csrf().disable()
            .headers()
            // the headers you want here. This solved all my CORS problems! 
            .addHeaderWriter(new StaticHeadersWriter("Access-Control-Allow-Origin", "*"))
            .addHeaderWriter(new StaticHeadersWriter("Access-Control-Allow-Methods", "POST, GET"))
            .addHeaderWriter(new StaticHeadersWriter("Access-Control-Max-Age", "3600"))
            .addHeaderWriter(new StaticHeadersWriter("Access-Control-Allow-Credentials", "true"))
            .addHeaderWriter(new StaticHeadersWriter("Access-Control-Allow-Headers", "Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization"));
    }
}

यह सबसे प्रत्यक्ष और स्पष्ट तरीका है जो मैंने इसे करने के लिए पाया। आशा है कि यह किसी की मदद करता है।


1

इसी से मेरा काम बना है।

@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

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

        http.cors();
    }

}

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry
            .addMapping("/**")
            .allowedMethods("*")
            .allowedHeaders("*")
            .allowedOrigins("*")
            .allowCredentials(true);
    }

}

1

चरण 1

एनोटेशन के साथ कंट्रोलर को @CrossOriginएनोटेट करने से कॉर्स कॉन्फ़िगरेशन की अनुमति देगा।

@CrossOrigin
@RestController
public class SampleController { 
  .....
}

चरण 2

वसंत में पहले से ही एक CorsFilter है भले ही आप अपने स्वयं के CorsFilter को एक बीन के रूप में पंजीकृत कर सकते हैं ताकि आप अपने स्वयं के कॉन्फ़िगरेशन को इस प्रकार प्रदान कर सकें।

@Bean
public CorsFilter corsFilter() {
    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    final CorsConfiguration config = new CorsConfiguration();
    config.setAllowedOrigins(Collections.singletonList("http://localhost:3000")); // Provide list of origins if you want multiple origins
    config.setAllowedHeaders(Arrays.asList("Origin", "Content-Type", "Accept"));
    config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH"));
    config.setAllowCredentials(true);
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
}

0

इसे जाँचें:

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
    ...
            .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
    ...
}

हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन यह कोड क्यों और / या इस बारे में अतिरिक्त संदर्भ प्रदान करता है कि यह प्रश्न इसके दीर्घकालिक मूल्य में सुधार करता है।
रोलस्टुफ़्लाहरर

0

WebSecurityConfigurerAdapter वर्ग का विस्तार करना और आपके @EnableWebSecurity वर्ग में ओवरराइडिंग कॉन्फ़िगरेशन () विधि काम करेगी: नीचे नमूना वर्ग है

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

         http
        .csrf().disable()
        .exceptionHandling();
         http.headers().cacheControl();

        @Override
        public CorsConfiguration getCorsConfiguration(final HttpServletRequest request) {
            return new CorsConfiguration().applyPermitDefaultValues();
        }
    });
   }
}

0

यदि मूल रूप से आपका प्रोग्राम वसंत सुरक्षा का उपयोग नहीं करता है और एक कोड परिवर्तन के लिए खर्च नहीं कर सकता है, तो एक सरल रिवर्स प्रॉक्सी बनाने से चाल हो सकती है। मेरे मामले में, मैंने निम्नलिखित कॉन्फ़िगरेशन के साथ Nginx का उपयोग किया:

http {
  server {
    listen 9090;
    location / {
      if ($request_method = 'OPTIONS') {
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
      #
      # Custom headers and headers various browsers *should* be OK with but aren't
      #
      add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
      #
      # Tell client that this pre-flight info is valid for 20 days
      #
      add_header 'Access-Control-Max-Age' 1728000;
      add_header 'Content-Type' 'text/plain; charset=utf-8';
      add_header 'Content-Length' 0;
      return 204;
      }
      if ($request_method = 'POST') {
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
      add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
      add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
      }
      if ($request_method = 'GET') {
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
      add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
      add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
      }

      proxy_pass http://localhost:8080;
    }
  }
}

मेरा कार्यक्रम सुनता है : 8080

REF: कॉर्न्स नगीनक्स पर


0

यह उत्तर @abosancic उत्तर की प्रतिलिपि बनाता है, लेकिन CORS शोषण से बचने के लिए अतिरिक्त सुरक्षा जोड़ता है ।

टिप 1: आने वाले मूल को प्रतिबिंबित न करें जैसा कि एक्सेस किए गए मेजबानों की सूची की जांच के बिना है।

टिप 2: केवल श्वेतसूचीबद्ध होस्ट के लिए क्रेडेंशियल अनुरोध करें।

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class SimpleCORSFilter implements Filter {

    private final Logger log = LoggerFactory.getLogger(SimpleCORSFilter.class);

    private List<String> allowedOrigins;

    public SimpleCORSFilter() {
        log.info("SimpleCORSFilter init");
        allowedOrigins = new ArrayList<>();
        allowedOrigins.add("https://mysafeorigin.com");
        allowedOrigins.add("https://itrustthissite.com");
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        String allowedOrigin = getOriginToAllow(request.getHeader("Origin"));

        if(allowedOrigin != null) {
            response.setHeader("Access-Control-Allow-Origin", allowedOrigin);
            response.setHeader("Access-Control-Allow-Credentials", "true");
        }

        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me");

        chain.doFilter(req, res);
    }

    @Override
    public void init(FilterConfig filterConfig) {
    }

    @Override
    public void destroy() {
    }

    public String getOriginToAllow(String incomingOrigin) {
        if(allowedOrigins.contains(incomingOrigin.toLowerCase())) {
            return incomingOrigin;
        } else {
            return null;
        }
    }
}

0

हमारे स्प्रिंग बूट ऐप में, हमने CorsConfigurationSource इस तरह स्थापित किया है।

allowedOrignsपहले जोड़ने और फिर सेट करने की अनुक्रम applyPermitDefaultValues()वसंत ने अनुमत हेडर, उजागर हेडर, अनुमत विधियों आदि के लिए डिफ़ॉल्ट मान सेट किए हैं, इसलिए हमें उन्हें निर्दिष्ट करने की आवश्यकता नहीं है।

    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("http://localhost:8084"));
        configuration.applyPermitDefaultValues();

        UrlBasedCorsConfigurationSource configurationSource = new UrlBasedCorsConfigurationSource();
        configurationSource.registerCorsConfiguration("/**", configuration);
        return configurationSource;
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
                .antMatchers("/api/**")
                .access("@authProvider.validateApiKey(request)")
                .anyRequest().authenticated()
                .and().cors()
                .and().csrf().disable()
                .httpBasic().authenticationEntryPoint(authenticationEntryPoint);

        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }

0

बस एक एकल वर्ग बनाएं , जैसे सब कुछ ठीक हो जाएगा:

        @Component
        @Order(Ordered.HIGHEST_PRECEDENCE)
        public class MyCorsConfig implements Filter {

            @Override
            public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
                final HttpServletResponse response = (HttpServletResponse) res;
                response.setHeader("Access-Control-Allow-Origin", "*");
                response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
                response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type, enctype");
                response.setHeader("Access-Control-Max-Age", "3600");
                if (HttpMethod.OPTIONS.name().equalsIgnoreCase(((HttpServletRequest) req).getMethod())) {
                    response.setStatus(HttpServletResponse.SC_OK);
                } else {
                    chain.doFilter(req, res);
                }
            }

            @Override
            public void destroy() {
            }

            @Override
            public void init(FilterConfig config) throws ServletException {
            }
        }

0

वसंत बूट और प्रतिक्रिया के बीच कॉर्स को अक्षम करने के लिए यह मेरे लिए काम किया है

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    /**
     * Overriding the CORS configuration to exposed required header for ussd to work
     *
     * @param registry CorsRegistry
     */

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("*")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(4800);
    }
}

मुझे नीचे की तरह सुरक्षा कॉन्फ़िगरेशन को भी संशोधित करना था:

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().disable()
                    .cors().configurationSource(new CorsConfigurationSource() {

                @Override
                public CorsConfiguration getCorsConfiguration(HttpServletRequest request) {
                    CorsConfiguration config = new CorsConfiguration();
                    config.setAllowedHeaders(Collections.singletonList("*"));
                    config.setAllowedMethods(Collections.singletonList("*"));
                    config.addAllowedOrigin("*");
                    config.setAllowCredentials(true);
                    return config;
                }
            }).and()
                    .antMatcher("/api/**")
                    .authorizeRequests()
                    .anyRequest().authenticated()
                    .and().httpBasic()
                    .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                    .and().exceptionHandling().accessDeniedHandler(apiAccessDeniedHandler());
        }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.