tutorial springsecurityutils springsecurityservice quickstart configuring rest grails spring-security cors

springsecurityutils - Configuración de CORS con Grails 3 y Spring Security REST



spring security core tutorial (1)

Estoy intentando descubrir cómo conectar un frontend Angular 2 (que se ejecuta en localhost: 4200) en un servidor de Grails 3 (que se ejecuta en localhost: 8080), así que necesito habilitar el soporte de CORS en la aplicación de Grails.

Encontré este proyecto de Github ( https://github.com/appcela/grails3-cors-interceptor-spring-security-rest-sample-app ) que muestra cómo habilitar CORS usando el complemento grails3-cors-interceptor. Estoy ejecutando esta misma aplicación como un backend de prueba y estoy poniendo un punto de interrupción en CorsService.processPreflight() para verificar cuándo se llama. Y cuando hago un GET en /api/books , el navegador envía una llamada OPTIONS primero que pasa por el punto de interrupción, pero el siguiente GET no parece ir allí y no puedo entender por qué. ¿Alguna idea?


Actualizar

Grails 3.2.1 tiene una característica incorporada para soportar CORS. Mira esto http://docs.grails.org/latest/guide/introduction.html#whatsNewCors

Solo agregue esto en su application.yml para habilitarlo

grails: cors: enabled: true

(Asegúrese de buscar el entorno para el que desea habilitar CORS)

Publicación original

No necesita un complemento (a menos que desee usar ese complemento) para habilitar CORS aquí. Bueno, para sus puntos finales de descanso, siempre puede habilitar el CORS usando los interceptores Grails como se muestra a continuación:

class CorsInterceptor { CorsInterceptor() { matchAll() } boolean before() { response.setHeader("Access-Control-Allow-Origin", "http://localhost:4200") 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 } }

Pero los interceptores de Grails no pueden interceptar los puntos finales provistos por los complementos de núcleo / descanso de Spring Security ya que la prioridad de sus interceptores es mayor que la de los interceptores de Grails. Por lo tanto, primero debe agregar un filtro de cliente y luego registrarlo antes de los filtros relacionados con Spring.

Agregue un archivo en 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) } } }

Regístrelo en los resources.groovy :

beans = { corsFilterFoo(CorsFilter) }

Ahora, agréguela a la cadena de filtros de Spring antes del filtro de contexto de seguridad (en Bootstrap.groovy ):

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

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