2016-10-07 55 views
6

Angular 2 ön ucunun (localhost: 4200 üzerinde çalışan) Grails 3 arka ucuna (localhost: 8080 üzerinde çalışan) nasıl bağlanacağını anlamaya çalışıyorum. CORS grails uygulamasında destek. CORS Yapıları Grails 3 ve Spring Security REST ile yapılandırma

Ben grails3-cors-önleme eklentisi kullanarak CORS'yi etkinleştirme gösteren bu Github proje ( https://github.com/appcela/grails3-cors-interceptor-spring-security-rest-sample-app) bulundu. Bu uygulamayı bir test arkası olarak çalıştırıyorum ve arandığını kontrol etmek için CorsService.processPreflight()'da bir kesme noktası koyuyor. Ben /api/books bir GET yaptığımda, tarayıcı bir SEÇENEKLER bu kesme geçer ilk çağrı, ancak aşağıdaki GET oraya gitmek görünmüyor ve nedenini çözemiyorum gönderir. Herhangi bir fikir?

+0

Hey! Grails 3.2.1 yeni çıktı. Bu CORS http://docs.grails.org/latest/guide/introduction.html#whatsNewCors –

cevap

10

Güncelleştirme

Kepçeler 3.2.1 CORS'yi desteklemek için dahili bir özelliğe sahiptir. dışarı bu kontrol http://docs.grails.org/latest/guide/introduction.html#whatsNewCors

Sadece etkinleştirmek için application.yml bu eklemek o

grails: 
    cors: 
     enabled: true 

Orijinal Kaydı (Eğer CORS'yi etkinleştirmek istediğiniz ortamı için bak emin olun) CORS'i etkinleştirmek için eklentiye ihtiyacınız yoktur (bu eklentiyi kullanmak istemiyorsanız). Eh, senin dinlenme uç noktaları için, her zaman aşağıda gibi Grails önleyicilerin kullanarak CORS'yi etkinleştirebilirsiniz:

class CorsInterceptor { 

    CorsInterceptor() { 
     matchAll() 
    } 

    boolean before() { 
     if (request.method == "OPTIONS") { 
      response.setHeader("Access-Control-Allow-Origin", "http://localhost:4200") 
      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.status = 200 
     } 

     return true 
    } 

    boolean after() { true } 
} 

Ama Grails interceptor Bahar Güvenlik çekirdek/geri kalanı tarafından eklentileri onların önleyicilerin öncelik beri sağlanan son noktalarını müdahale edemez vardır Grails önleyicilerinden daha yüksek. Bu nedenle önce bir müşteri filtresi eklemeniz ve ardından Yay ile ilgili filtrelerden önce kaydetmeniz gerekir. Şimdi

beans = { 
    corsFilterFoo(CorsFilter) 
} 

(Bootstrap.groovy olarak) güvenlik içeriği filtresi önce Spring'in filtre zincirine eklemek:

package test 

import org.springframework.web.filter.OncePerRequestFilter 

import javax.servlet.FilterChain 
import javax.servlet.ServletException 
import javax.servlet.http.HttpServletRequest 
import javax.servlet.http.HttpServletResponse 

class CorsFilter extends OncePerRequestFilter { 

    @Override 
    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse resp, FilterChain chain) 
      throws ServletException, IOException { 

     if (req.getMethod() == "OPTIONS") { 
      resp.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") 
      resp.addHeader("Access-Control-Max-Age", "3600") 
      resp.addHeader("Access-Control-Allow-Origin", "http://localhost:4200") 
      resp.addHeader("Access-Control-Allow-Credentials", "true") 
      resp.status = 200 
     } else { 
      chain.doFilter(req, resp) 
     } 
    } 
} 

resources.groovy üzerine Kayıt:

src/main/groovy bir dosyayı ekleme

SpringSecurityUtils.clientRegisterFilter("corsFilterFoo", 
    SecurityFilterPosition.SECURITY_CONTEXT_FILTER.order - 1) 

Referanslar: https://github.com/grails-plugins/grails-spring-security-core/blob/v3.1.1/src/main/groovy/grails/plugin/springsecurity/SpringSecurityUtils.groovy#L698

+1

Nereye filtreyi kayıt son satırı eklerim inbuilt etti? – Sebastien

+2

Oops! afedersiniz. Bunu "Bootstrap.groovy" –

+0

@ShashankAgrawal'a ekleyin. Grails 3.2.7 kullanıyorum. CORS'yi application.yml'de grants 3 ile etkinleştirmek için gerekli adımları takip ettim. OPTIONS yönteminin istek yöntemlerinden herhangi birine geçirilmesine izin vermeye çalışıyorum. Ama sadece korları etkinleştirerek, bunu başaramıyorum. Bu konuda ayrıntılı bilgi verir misiniz? – artapart