2016-10-07 3 views
6

Ich versuche herauszufinden, wie man ein Angular 2 Frontend (läuft auf localhost: 4200) in ein Grails 3 Backend (läuft auf localhost: 8080), also muss ich aktivieren CORS-Unterstützung in der Grails App.Konfigurieren von CORS mit Grails 3 und Spring Security REST

Ich fand dieses Github-Projekt (https://github.com/appcela/grails3-cors-interceptor-spring-security-rest-sample-app), das zeigt, wie man CORS mit dem Grails3-Cors-Interceptor-Plugin aktiviert. Ich führe gerade diese Anwendung als Test-Backend aus und setze einen Breakpoint in CorsService.processPreflight(), um zu überprüfen, wann er aufgerufen wird. Und wenn ich einen GET auf /api/books mache, sendet der Browser zuerst einen OPTIONS-Aufruf, der durch den Haltepunkt geht, aber das folgende GET scheint nicht dorthin zu gehen, und ich kann nicht herausfinden, warum. Irgendeine Idee?

+0

Hey! Grails 3.2.1 wurde gerade veröffentlicht. Es hat CORS integriert http://docs.grails.org/latest/guide/introduction.html#whatsNewCors –

Antwort

10

Aktualisieren

Grails 3.2.1 verfügt über eingebaute Funktion zur Unterstützung von CORS. Check this out http://docs.grails.org/latest/guide/introduction.html#whatsNewCors

Fügen Sie einfach diese in Ihrem application.yml es zu ermöglichen

grails: 
    cors: 
     enabled: true 

(Stellen Sie sicher, dass Sie die Umwelt suchen, für die Sie CORS aktivieren)

Original-Beitrag

Sie benötigen kein Plugin (außer Sie wollen dieses Plugin benutzen), um CORS hier zu aktivieren. Nun, für Ihre Erholung Endpunkte, können Sie immer die CORS ermöglichen, die Grails Abfangjäger mit wie unten:

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

Aber Grails Abfangjäger können die Endpunkte nicht abfangen vom Kern/Rest Spring Security bereitgestellt Plugins, da die Priorität ihrer Abfangjäger sind höher als die der Grails-Abfangjäger. Sie müssen also zuerst einen Kundenfilter hinzufügen und ihn dann vor den Spring-Filtern registrieren.

Fügen Sie eine Datei in src/main/groovy:

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

Registrieren Sie auf dem resources.groovy:

beans = { 
    corsFilterFoo(CorsFilter) 
} 

Nun fügen Sie die Filterkette Frühling vor dem Sicherheitskontext Filter (in Bootstrap.groovy):

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

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

+1

Wo fügen Sie die letzte Zeile, um den Filter zu registrieren? – Sebastien

+2

Hoppla! Es tut uns leid. Fügen Sie es 'Bootstrap.groovy' hinzu –

+0

@ShashankAgrawal Ich verwende Grails 3.2.7 Ich folgte den Schritten zum Aktivieren von CORS mit Grails 3 in application.yml. Ich versuche, die OPTIONS-Methode mit einer der Anforderungsmethoden zu übergeben. Aber durch einfaches Aktivieren der Kors kann ich das nicht erreichen. Können Sie das bitte näher ausführen? – artapart

Verwandte Themen