#rest #grails #spring-security #cors
#rest #grails #spring-безопасность #cors
Вопрос:
Я пытаюсь выяснить, как подключить интерфейс Angular 2 (работающий на localhost: 4200) к серверной части Grails 3 (работающей на localhost: 8080), поэтому мне нужно включить поддержку CORS в приложении grails.
Я нашел этот проект на Github (https://github.com/appcela/grails3-cors-interceptor-spring-security-rest-sample-app ), который показывает, как включить CORS с помощью плагина grails3-cors-interceptor. Я запускаю это самое приложение в качестве тестовой серверной части и устанавливаю точку останова, CorsService.processPreflight()
чтобы проверить, когда она вызывается. И когда я выполняю GET on /api/books
, браузер сначала отправляет вызов OPTIONS, который проходит через точку останова, но следующий GET, похоже, туда не попадает, и я не могу понять почему. Есть идеи?
Комментарии:
1. Привет! Grails 3.2.1 только что выпущен. Он имеет встроенные CORS docs.grails.org/latest/guide/introduction.html#whatsNewCors
Ответ №1:
Обновить
Grails 3.2.1 имеет встроенную функцию для поддержки CORS. Проверьте это http://docs.grails.org/latest/guide/theWebLayer.html#cors
Просто добавьте это в свой application.yml
, чтобы включить его
grails:
cors:
enabled: true
(Убедитесь, что вы ищете среду, для которой хотите включить CORS)
Оригинальное сообщение
Вам не нужен плагин (если вы не хотите использовать этот плагин), чтобы включить CORS здесь. Что ж, для ваших конечных точек rest вы всегда можете включить CORS, используя перехватчики Grails, как показано ниже:
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 }
}
Но перехватчики Grails не могут перехватывать конечные точки, предоставляемые плагинами Spring Security core / rest, поскольку приоритет их перехватчиков выше, чем у перехватчиков Grails. Итак, сначала вам нужно добавить фильтр клиента, а затем зарегистрировать его перед фильтрами, связанными с Spring.
Добавьте файл в 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)
}
}
}
Зарегистрируйте его на resources.groovy
:
beans = {
corsFilterFoo(CorsFilter)
}
Теперь добавьте его в цепочку фильтров Spring перед фильтром контекста безопасности (in Bootstrap.groovy
):
SpringSecurityUtils.clientRegisterFilter("corsFilterFoo",
SecurityFilterPosition.SECURITY_CONTEXT_FILTER.order - 1)
Комментарии:
1. Куда вы добавляете последнюю строку для регистрации фильтра?
2. Ой! извините. Добавьте его в
Bootstrap.groovy
3. @ShashankAgrawal Я использую Grails 3.2.7 Я выполнил шаги по включению CORS с grails 3 в application.yml. Я пытаюсь разрешить передачу метода OPTIONS с любым из методов запроса. Но, просто включив cors, я не могу этого достичь. Не могли бы вы подробнее остановиться на этом?
4. Вам не нужно разрешать метод OPTIONS, потому что это метод, который используется для предполетного запроса, чтобы проверить, разрешен CORS или нет
Ответ №2:
В последней версии Grails 3 вам просто нужно включить CORS, если вы запускаете свои приложения локально grails run-app
. Моя версия Grails Version: 3.3.10
. Groovy grails.cors.enabled=true