2015-12-07 30 views
5

मैं स्प्रिंग बूट एप्लिकेशन की रिवर्स प्रॉक्सी के रूप में Nginx का उपयोग कर रहा हूं। मैं सॉकेट और स्टॉम्प संदेशों के साथ Websockets का भी उपयोग करता हूं।Nginx रिवर्स प्रॉक्सी वेबसाइट्स प्रमाणीकरण - HTTP 403

यहां संदर्भ कॉन्फ़िगरेशन है।

var socket = new SockJS(entryPointUrl); 
var stompClient = Stomp.over(socket); 

var _this = this; 

stompClient.connect({}, function() { 
    stompClient.subscribe('/app/some-url', function (message) { 
     // do some stuff 
    }); 
}); 

मैं आपको यह भी वसंत सुरक्षा कुछ सामग्री की रक्षा के लिए:

<websocket:message-broker application-destination-prefix="/app"> 
    <websocket:stomp-endpoint path="/localization" > 
     <websocket:sockjs/> 
    </websocket:stomp-endpoint> 
    <websocket:simple-broker prefix="/topic" /> 
</websocket:message-broker> 

यहाँ ग्राहक कोड है।

@Configuration 
@Order(4) 
public static class FrontendSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests() 
       .antMatchers("/js/**", "/css/**", "/webjars/**").permitAll() 
       .anyRequest().authenticated() 
       .and() 
       .formLogin().loginPage("/login").permitAll() 
       .and() 
       .logout().permitAll(); 
    } 

} 

सबकुछ बढ़िया काम करता है, उम्मीद है कि जब मैं इस एप्लिकेशन को Nginx रिवर्स प्रॉक्सी के पीछे चलाता हूं। यहां रिवर्स कॉन्फ़िगरेशन है:

proxy_pass http://testsysten:8080; 

    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header Host $host; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

    # WebSocket support (nginx 1.4) 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $http_connection; 

    # Max body size 
    client_max_body_size 10M; 

कनेक्शन हमेशा HTTP 403 कोड के साथ विफल रहता है।

मैं संस्करण 1.9.7 का उपयोग कर रहा हूं।

क्या आपके पास कोई विचार है, ग्राहक को प्रमाणीकृत क्यों नहीं मिलता है?

मुझे इसी तरह के प्रश्न हैं, जैसे this one लेकिन समाधान बिल्कुल काम नहीं करते हैं।

अद्यतन

मैं HTTP पर एप्लिकेशन चलाने में कामयाब रहा। मुझे Nginx कॉन्फ़िगरेशन में CSRF टोकन पास करने की आवश्यकता है। नई कॉन्फ़िगरेशन है:

proxy_pass http://testsysten:8080; 

    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header Host $host; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

    # Pass the csrf token (see https://de.wikipedia.org/wiki/Cross-Site-Request-Forgery) 
    # Default in Spring Boot 
    proxy_pass_header X-XSRF-TOKEN; 

    # WebSocket support (nginx 1.4) 
    proxy_http_version 1.1; 

केवल अनुपलब्ध HTTPS पर रीडायरेक्ट किया गया है।

o.s.w.s.s.t.h.DefaultSockJsService - Processing transport request: GET http://testsystem:80/localization/226/3mbmu212/websocket 

लगता Nginx प्रॉक्सी सही बंदरगाह के लिए फिर से लिखने की जरूरत है जैसे: स्प्रिंग लॉग में प्रवेश के बाद देखते हैं।

उत्तर

7

मैंने स्वयं को समस्या हल की। मूल रूप से, यदि आप वेबसाइट और स्प्रिंग सुरक्षा का उपयोग करना चाहते हैं तो Nginx को कुछ अतिरिक्त शीर्षलेख मानों को पारित करने की आवश्यकता है। निम्नलिखित लाइनों अपने Nginx config में location अनुभाग में जोड़े जाने की जरूरत है:

# Pass the csrf token (see https://de.wikipedia.org/wiki/Cross-Site-Request-Forgery) 
    # Default in Spring Boot and required. Without it nginx suppresses the value 
    proxy_pass_header X-XSRF-TOKEN; 

    # Set origin to the real instance, otherwise a of Spring security check will fail 
    # Same value as defined in proxy_pass 
    proxy_set_header Origin "http://testsysten:8080"; 
0

मैं एक ऐसी ही समस्या का सामना करना पड़ा था। मैं एनजीआईएनएक्स के साथ मूल वसंत सुरक्षा प्रमाणीकरण का उपयोग करने में असमर्थ था। proxy_pass_header X-XSRF-TOKEN; को सेट करने के अलावा, मुझे underscores_in_headers on; सेट करना पड़ा, क्योंकि डिफ़ॉल्ट रूप से एनजीआईएनएक्स हेडर को अंडरस्कोर के साथ अनुमति नहीं देता है और सीएसआरएफ टोकन को _csrf नाम दिया जाता है।

तो मेरा अंतिम विन्यास फाइल इस तरह देखा:

server { 
    underscores_in_headers on; 
    listen 80 default_server; 
    listen [::]:80 default_server ipv6only=on; 

    root /usr/share/nginx/html; 
    index index.html index.htm; 

    # Make site accessible from http://localhost/ 
    server_name localhost; 

    location/{ 
      # First attempt to serve request as file, then 
      # as directory, then fall back to displaying a 404. 
      try_files $uri $uri/ =404; 
      # Uncomment to enable naxsi on this location 
      # include /etc/nginx/naxsi.rules 
    } 
    location /example/ { 
      proxy_pass_header X-XSRF-TOKEN; 
      proxy_pass  http://localhost:8080/; 
    } 
} 
0

मैं nginx प्रॉक्सी में CSRF हेडर के बिना इस समस्या का समाधान।

मेरा ढेर: वसंत-बूट, वसंत-सुरक्षा (रेडिस सत्र स्टोर के साथ), वसंत-बूट-वेबसाकेट with default STOMP implementation, एनजीआईएनएक्स फ्रंटेंड की सेवा करने के लिए और सामने आने वाली दूसरी सेवाओं के लिए प्रॉक्सी किया गया।

पहली बार में मैं default configuration show in the NGINX Blog here और यहाँ (कॉपी और इतिहास के लिए पेस्ट) का उपयोग करें:

http { 
    map $http_upgrade $connection_upgrade { 
     default upgrade; 
     '' close; 
    } 

    upstream websocket { 
     server 192.168.100.10:8010; 
    } 

    server { 
     listen 8020; 
     location/{ 
      proxy_pass http://websocket; 
      proxy_http_version 1.1; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection $connection_upgrade; 
     } 
    } 
} 

लेकिन काम करते हैं, अभी भी 403 निषिद्ध नहीं है।

worker_processes 1; 

events { 
    worker_connections 1024; 
} 

http { 

    include  mime.types; 
    default_type application/octet-stream; 
    sendfile  on; 
    keepalive_timeout 65; 

    server { 
     listen  30010; 
     server_name localhost; 
     client_max_body_size 10M; 

     location/{ 
      root /usr/share/nginx/html; 
      index index.html index.htm; 
     } 

     # Backend API Proxy 
     location /api { 
      proxy_pass http://192.168.0.100:30080; 
      proxy_set_header Host $http_host; 
      proxy_set_header Access-Control-Allow-Origin 192.168.0.100; 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
      proxy_set_header X-NginX-Proxy true; 
      rewrite ^/api/?(.*) /$1 break; 
      proxy_redirect off; 
     } 

     # CDN Proxy 
     location ~ ^/cdn/(.*) { 
      proxy_pass http://192.168.0.110:9000; 
      rewrite ^/cdn/(.*) /$1 break; 
     } 

     # This is the configuration that fix the problem with WebSocket 
     # WebSocket Proxy 
     location /ws { 
      proxy_pass http://192.168.0.120:30090; 
      proxy_http_version 1.1; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection "upgrade"; 
      proxy_set_header Host $http_host; 
      proxy_set_header Access-Control-Allow-Origin 192.168.0.120; 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
      proxy_set_header X-NginX-Proxy true; 
     } 

    } 

} 
1

स्वीकार कर लिया समाधान मेरे लिए हालांकि मैं एक बहुत ही शास्त्रीय उपयोग कर रहा था काम नहीं किया:

मैं नीचे विन्यास के साथ यह समस्या ठीक (वास्तविक महत्वपूर्ण WebSocket ठीक करने के लिए भाग # WebSocket प्रॉक्सी है) HTTPS का विन्यास:

:

server { 
    listen 443 ssl; 
    location /ws { 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
     proxy_set_header Host $http_host; 
     proxy_pass http://127.0.0.1:8888; 
    } 
... 

समस्या यह है कि वसंत मूल जाँच करता है और विशेष रूप से है कि कोड मुझे मुसीबत पैदा कर रहा था है

// in org.springframework.web.util.UriComponentsBuilder.adaptFromForwardedHeaders(HttpHeaders): 
     if ((this.scheme.equals("http") && "80".equals(this.port)) || 
       (this.scheme.equals("https") && "443".equals(this.port))) { 
      this.port = null; 
     } 

उस कोड में यह योजना 'http' है और बंदरगाह 8888 है, जिसे त्याग दिया नहीं गया है क्योंकि यह मानक बंदरगाह नहीं है।

ब्राउज़र हालांकि https://myserver/ हिट करता है और 443 पोर्ट छोड़ा जाता है क्योंकि यह डिफ़ॉल्ट HTTPS है।

इसलिए बंदरगाह मेल नहीं खाते (खाली! = 8888) और मूल जांच विफल हो जाती है।

या तो आप स्प्रिंग WebSockets में मूल जांचों को अक्षम कर सकते हैं:

registry.addHandler(resgisterHandler(), "/ws").setAllowedOrigins("*"); 

या (शायद सुरक्षित) आप nginx प्रॉक्सी कॉन्फ़िगरेशन को योजना और बंदरगाह जोड़ सकते हैं:

proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_set_header X-Forwarded-Port $server_port; 

आप तो रुचि रखते हैं, उन शीर्षकों को

org.springframework.web.util.UriComponentsBuilder.adaptFromForwardedHeaders(HttpHeaders) 
में पढ़ा जाता है
संबंधित मुद्दे