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)