33

मैं जावा कॉन्फ़िगरेशन के साथ स्प्रिंग-सुरक्षा 3.2.0.RC2 का उपयोग कर रहा हूं। मैंने एक सरल HttpSecurity कॉन्फ़िगरेशन स्थापित किया है जो मूल vuth/v1/** पर पूछता है। प्राप्त अनुरोधों काम करते हैं लेकिन पोस्ट अनुरोध के साथ विफल:जावा कॉन्फ़िगर के साथ स्प्रिंग-सिक्योरिटी में, httpBasic POST सीएसआरएफ टोकन क्यों चाहता है?

HTTP Status 403 - Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'. 

मेरे सुरक्षा config इस तरह दिखता है:

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

@Resource 
private MyUserDetailsService userDetailsService; 

@Autowired 
//public void configureGlobal(AuthenticationManagerBuilder auth) 
public void configure(AuthenticationManagerBuilder auth) 
     throws Exception { 
    StandardPasswordEncoder encoder = new StandardPasswordEncoder(); 
    auth.userDetailsService(userDetailsService).passwordEncoder(encoder); 
} 

@Configuration 
@Order(1) 
public static class RestSecurityConfig 
     extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .antMatcher("/v1/**").authorizeRequests() 
       .antMatchers("/v1/**").authenticated() 
      .and().httpBasic(); 
    } 
} 

} 

किसी भी मदद के लिए इस पर बहुत सराहना।

+1

आप CSRF निष्क्रिय करने के लिए (क्योंकि यह एक कारण के लिए है) चाहते dan't यदि आप जोड़ सकते हैं csrf-value के साथ एक छिपी हुई फ़ील्ड और स्वीकृत पोस्ट में स्टर्मंडेलक्स सुझाव जैसे मूल्य जोड़ें। यह मेरे लिए ठीक काम करता है, सीएसआरएफ – Xtroce

+0

@Xtroce अक्षम किए बिना, हालांकि मेरे मामले में मुझे AJAX पोस्ट * हेडर * में 'एक्स-सीएसआरएफ-टोकन' जोड़ना पड़ा। (AJAX पोस्ट * पैरामीटर * में '_csrf' जोड़ना * काम नहीं किया।) – inanutshellus

+0

@Xtroce टिप्पणी में जोड़ना, अगर आप temmeating के लिए थाइमेलीफ का उपयोग करते हैं, तो आप

और टेम्पलेट इंजन स्वचालित रूप से" _csrf "नामक एक छिपी इनपुट फ़ील्ड प्रदान करेगा जो सही मान के साथ आबादी वाला है। –

उत्तर

53

CSRF जावा कॉन्फ़िगरेशन के साथ डिफ़ॉल्ट रूप से सुरक्षा सक्षम है। उसे निष्क्रिय करने के लिए:

@Configuration 
public class RestSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .csrf().disable() 
      ...; 
    } 
} 
+5

तो, स्पष्ट सवाल यह है कि, यदि वह इसे अक्षम नहीं कर रहा है, तो शून्य मूल्य के साथ उसकी समस्या क्या थी? मुझे वास्तव में एक ही समस्या है और मैं जहां तक ​​जानता हूं, मैं सीएसआरएफ सुरक्षा को अक्षम नहीं कर रहा हूं। – starmandeluxe

+1

@starmandeluxe जब सीएसआरएफ सुरक्षा सक्षम होती है, तो वसंत सुरक्षा पोस्ट का उपयोग करते समय ग्राहक से सीएसआरएफ टोकन की अपेक्षा करता है। यदि ग्राहक इस तरह के टोकन नहीं भेजता है, तो यह शून्य होगा, जिसका मतलब है गायब है। – holmis83

+1

ओह, लेकिन मैं अपने AJAX कॉल में भेज रहा हूँ: beforeSend:। समारोह (XHR) { \t \t \t xhr.setRequestHeader ('एक्स-CSRF-टोकन', $ ("मेटा [name = '_ CSRF']") attr ('सामग्री')); – starmandeluxe

5

तुम भी CSRF जांच केवल कुछ अनुरोध या तरीकों पर, निष्क्रिय http वस्तु के लिए नीचे दिए कॉन्फ़िगरेशन जैसा का उपयोग कर सकते हैं:

http 
    .csrf().requireCsrfProtectionMatcher(new RequestMatcher() { 

    private Pattern allowedMethods = 
     Pattern.compile("^(GET|HEAD|TRACE|OPTIONS)$"); 

    private RegexRequestMatcher apiMatcher = 
     new RegexRequestMatcher("/v[0-9]*/.*", null); 

    @Override 
    public boolean matches(HttpServletRequest request) { 
     // CSRF disabled on allowedMethod 
     if(allowedMethods.matcher(request.getMethod()).matches()) 
      return false; 

     // CSRF disabled on api calls 
     if(apiMatcher.matches(request)) 
      return false; 

     // CSRF enables for other requests 
     return true; 
    } 
}); 

आप यहाँ अधिक देख सकते हैं :

http://blog.netgloo.com/2014/09/28/spring-boot-enable-the-csrf-check-selectively-only-for-some-requests/

संबंधित मुद्दे